ERC-20
Overview
Max Total Supply
500,000,000,000 VSWARM
Holders
93
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
984,747,688.477792560759890339 VSWARMValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ValidatorSwarm
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/** * https://vswarm.xyz/ | https://t.me/vswarm */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom( address from, address to, uint256 amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } function decimals() public view virtual override returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _transferOwnership(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } library SafeMath { function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } contract ValidatorSwarm is ERC20, Ownable { using SafeMath for uint256; uint256 public maxSupply; // what the total supply can reach and not go beyond IUniswapV2Router02 private uniswapV2Router; address private uniswapV2Pair; bool private _swapping; address private _swapFeeReceiver; uint256 public maxTransactionAmount; uint256 public maxWallet; uint256 public swapTokensThreshold; bool public limitsInEffect = true; bool public tradingEnabled = false; uint256 public totalFees; uint256 private _marketingFee; uint256 private _liquidityFee; uint256 private _validatorFee; uint256 private _tokensForMarketing; uint256 private _tokensForLiquidity; uint256 private _tokensForValidator; // staking vars uint256 public totalStaked; address public stakingToken; address public rewardToken; uint256 public apr; bool public stakingEnabled = false; uint256 public totalClaimed; struct Validator { uint256 creationTime; uint256 staked; } struct Staker { address staker; uint256 start; uint256 staked; uint256 earned; } struct ClaimHistory { uint256[] dates; uint256[] amounts; } // exlcude from fees and max transaction amount mapping (address => bool) private _isExcludedFromFees; mapping (address => bool) private _isExcludedMaxTransactionAmount; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping (address => bool) private _automatedMarketMakerPairs; // to stop bot spam buys and sells on launch mapping(address => uint256) private _holderLastTransferBlock; // stake data mapping(address => mapping(uint256 => Staker)) private _stakers; mapping(address => ClaimHistory) private _claimHistory; Validator[] public validators; /** * @dev Throws if called by any account other than the _swapFeeReceiver */ modifier teamOROwner() { require(_swapFeeReceiver == _msgSender() || owner() == _msgSender(), "Caller is not the _swapFeeReceiver address nor owner."); _; } modifier isStakingEnabled() { require(stakingEnabled, "Staking is not enabled."); _; } constructor() ERC20("Validator Swarm", "VSWARM") payable { IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); _isExcludedMaxTransactionAmount[address(_uniswapV2Router)] = true; uniswapV2Router = _uniswapV2Router; uint256 marketingFee = 2; uint256 liquidityFee = 1; uint256 validatorFee = 3; uint256 totalSupply = 5e11 * 1e18; maxSupply = 1e12 * 1e18; maxTransactionAmount = totalSupply * 1 / 100; // 1% maxWallet = totalSupply * 1 / 100; // 1% swapTokensThreshold = totalSupply * 1 / 1000; _marketingFee = marketingFee; _liquidityFee = liquidityFee; _validatorFee = validatorFee; totalFees = _marketingFee + _liquidityFee + _validatorFee; _swapFeeReceiver = owner(); // exclude from paying fees or having max transaction amount excludeFromFees(owner(), true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); _isExcludedMaxTransactionAmount[owner()] = true; _isExcludedMaxTransactionAmount[address(this)] = true; _isExcludedMaxTransactionAmount[address(0xdead)] = true; stakingToken = address(this); rewardToken = address(this); apr = 50; _mint(msg.sender, totalSupply); } /** * @dev Once live, can never be switched off */ function enableTrading() external teamOROwner { require(!tradingEnabled, "Can only enable once."); tradingEnabled = true; } /** * @dev Remove limits after token is somewhat stable */ function removeLimits() external teamOROwner { limitsInEffect = false; } /** * @dev Exclude from fee calculation */ function excludeFromFees(address account, bool excluded) public teamOROwner { _isExcludedFromFees[account] = excluded; } /** * @dev Update token fees (max set to initial fee) */ function updateFees(uint256 marketingFee, uint256 liquidityFee, uint256 validatorFee) external onlyOwner { _marketingFee = marketingFee; _liquidityFee = liquidityFee; _validatorFee = validatorFee; totalFees = _marketingFee + _liquidityFee + _validatorFee; require(totalFees <= 6, "Must keep fees at 6% or less"); } /** * @dev Update wallet that receives fees and newly added LP */ function updateFeeReceiver(address newWallet) external teamOROwner { _swapFeeReceiver = newWallet; } /** * @dev Very important function. * Updates the threshold of how many tokens that must be in the contract calculation for fees to be taken */ function updateSwapTokensThreshold(uint256 newThreshold) external teamOROwner returns (bool) { require(newThreshold >= totalSupply() * 1 / 100000, "Swap threshold cannot be lower than 0.001% total supply."); require(newThreshold <= totalSupply() * 5 / 1000, "Swap threshold cannot be higher than 0.5% total supply."); swapTokensThreshold = newThreshold; return true; } /** * @dev Check if an address is excluded from the fee calculation */ function isExcludedFromFees(address account) external view returns(bool) { return _isExcludedFromFees[account]; } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); if (amount == 0) { super._transfer(from, to, 0); return; } // all to secure a smooth launch if (limitsInEffect) { if ( from != owner() && to != owner() && to != address(0xdead) && !_swapping ) { if (to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair)){ require(tradingEnabled, "Trading is not enabled."); require(_holderLastTransferBlock[tx.origin] < block.number, "_transfer:: Transfer Delay enabled. Only one purchase per block allowed."); _holderLastTransferBlock[tx.origin] = block.number; } // on buy if (_automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) { require(amount <= maxTransactionAmount, "_transfer:: Buy transfer amount exceeds the maxTransactionAmount."); require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded"); } // on sell else if (_automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) { require(amount <= maxTransactionAmount, "_transfer:: Sell transfer amount exceeds the maxTransactionAmount."); } else if (!_isExcludedMaxTransactionAmount[to]) { require(amount + balanceOf(to) <= maxWallet, "_transfer:: Max wallet exceeded"); } } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensThreshold; if ( canSwap && !_swapping && !_automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { _swapping = true; swapBack(); _swapping = false; } bool takeFee = !_swapping; // if any addy belongs to _isExcludedFromFee or isn't a swap then remove the fee if ( _isExcludedFromFees[from] || _isExcludedFromFees[to] || (!_automatedMarketMakerPairs[from] && !_automatedMarketMakerPairs[to]) ) takeFee = false; uint256 fees = 0; if (takeFee) { fees = amount.mul(totalFees).div(100); _tokensForLiquidity += fees * _liquidityFee / totalFees; _tokensForValidator += fees * _validatorFee / totalFees; _tokensForMarketing += fees * _marketingFee / totalFees; if (fees > 0) { super._transfer(from, address(this), fees); } amount -= fees; } super._transfer(from, to, amount); } function _swapTokensForEth(uint256 tokenAmount) internal { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal { _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, 0, _swapFeeReceiver, block.timestamp ); } function swapBack() internal { uint256 contractBalance = balanceOf(address(this)); uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + _tokensForValidator; if (contractBalance == 0 || totalTokensToSwap == 0) return; if (contractBalance > swapTokensThreshold) contractBalance = swapTokensThreshold; // Halve the amount of liquidity tokens uint256 liquidityTokens = contractBalance * _tokensForLiquidity / totalTokensToSwap / 2; uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens); uint256 initialETHBalance = address(this).balance; _swapTokensForEth(amountToSwapForETH); uint256 ethBalance = address(this).balance.sub(initialETHBalance); uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div(totalTokensToSwap); uint256 ethForValidator = ethBalance.mul(_tokensForValidator).div(totalTokensToSwap); uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForValidator; _tokensForLiquidity = 0; _tokensForMarketing = 0; _tokensForValidator = 0; payable(_swapFeeReceiver).transfer(ethForMarketing.add(ethForValidator)); if (liquidityTokens > 0 && ethForLiquidity > 0) { _addLiquidity(liquidityTokens, ethForLiquidity); } } /** * @dev Transfer eth stuck in contract to _swapFeeReceiver */ function withdrawContractETH() external { payable(_swapFeeReceiver).transfer(address(this).balance); } /** * @dev In case swap wont do it and sells/buys might be blocked */ function forceSwap() external teamOROwner { _swapTokensForEth(balanceOf(address(this))); } /** * * @dev Staking part starts here * */ /** * @dev Checks if holder is staking */ function isStaking(address stakerAddr, uint256 validator) public view returns (bool) { return _stakers[stakerAddr][validator].staker == stakerAddr; } /** * @dev Returns how much staker is staking */ function userStaked(address staker, uint256 validator) public view returns (uint256) { return _stakers[staker][validator].staked; } /** * @dev Returns how much staker has claimed over time */ function userClaimHistory(address staker) public view returns (ClaimHistory memory) { return _claimHistory[staker]; } /** * @dev Returns how much staker has earned */ function userEarned(address staker, uint256 validator) public view returns (uint256) { uint256 currentlyEarned = _userEarned(staker, validator); uint256 previouslyEarned = _stakers[msg.sender][validator].earned; if (previouslyEarned > 0) return currentlyEarned.add(previouslyEarned); return currentlyEarned; } function _userEarned(address staker, uint256 validator) private view returns (uint256) { require(isStaking(staker, validator), "User is not staking."); uint256 staked = userStaked(staker, validator); uint256 stakersStartInSeconds = _stakers[staker][validator].start.div(1 seconds); uint256 blockTimestampInSeconds = block.timestamp.div(1 seconds); uint256 secondsStaked = blockTimestampInSeconds.sub(stakersStartInSeconds); uint256 earn = staked.mul(apr).div(100); uint256 rewardPerSec = earn.div(365).div(24).div(60).div(60); uint256 earned = rewardPerSec.mul(secondsStaked); return earned; } /** * @dev Stake tokens in validator */ function stake(uint256 stakeAmount, uint256 validator) external isStakingEnabled { require(totalSupply() <= maxSupply, "There are no more rewards left to be claimed."); // Check user is registered as staker if (isStaking(msg.sender, validator)) { _stakers[msg.sender][validator].staked += stakeAmount; _stakers[msg.sender][validator].earned += _userEarned(msg.sender, validator); _stakers[msg.sender][validator].start = block.timestamp; } else { _stakers[msg.sender][validator] = Staker(msg.sender, block.timestamp, stakeAmount, 0); } validators[validator].staked += stakeAmount; totalStaked += stakeAmount; _burn(msg.sender, stakeAmount); } /** * @dev Claim earned tokens from stake in validator */ function claim(uint256 validator) external isStakingEnabled { require(isStaking(msg.sender, validator), "You are not staking!?"); require(totalSupply() <= maxSupply, "There are no more rewards left to be claimed."); uint256 reward = userEarned(msg.sender, validator); _claimHistory[msg.sender].dates.push(block.timestamp); _claimHistory[msg.sender].amounts.push(reward); totalClaimed += reward; _mint(msg.sender, reward); _stakers[msg.sender][validator].start = block.timestamp; _stakers[msg.sender][validator].earned = 0; } /** * @dev Claim earned and staked tokens from validator */ function unstake(uint256 validator) external { require(isStaking(msg.sender, validator), "You are not staking!?"); uint256 reward = userEarned(msg.sender, validator); if (totalSupply().add(reward) < maxSupply && stakingEnabled) { _claimHistory[msg.sender].dates.push(block.timestamp); _claimHistory[msg.sender].amounts.push(reward); totalClaimed += reward; _mint(msg.sender, _stakers[msg.sender][validator].staked.add(reward)); } else { _mint(msg.sender, _stakers[msg.sender][validator].staked); } validators[validator].staked -= _stakers[msg.sender][validator].staked; totalStaked -= _stakers[msg.sender][validator].staked; delete _stakers[msg.sender][validator]; } /** * @dev Creates validator */ function createValidator() external teamOROwner { Validator memory validator = Validator(block.timestamp, 0); validators.push(validator); } /** * @dev Returns amount of validators */ function amountOfValidators() public view returns (uint256) { return validators.length; } /** * @dev Enables/disables staking */ function setStakingState(bool onoff) external teamOROwner { stakingEnabled = onoff; } receive() external payable {} }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountOfValidators","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"apr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakerAddr","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"isStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"onoff","type":"bool"}],"name":"setStakingState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"validatorFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"updateSwapTokensThreshold","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"userClaimHistory","outputs":[{"components":[{"internalType":"uint256[]","name":"dates","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct ValidatorSwarm.ClaimHistory","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"userEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"validator","type":"uint256"}],"name":"userStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"validators","outputs":[{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"staked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawContractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526001600d60006101000a81548160ff0219169083151502179055506000600d60016101000a81548160ff0219169083151502179055506000601960006101000a81548160ff0219169083151502179055506040518060400160405280600f81526020017f56616c696461746f7220537761726d00000000000000000000000000000000008152506040518060400160405280600681526020017f56535741524d00000000000000000000000000000000000000000000000000008152508160039080519060200190620000d9929190620008cc565b508060049080519060200190620000f2929190620008cc565b5050506200011562000109620004ff60201b60201c565b6200050760201b60201c565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90506001601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006002905060006001905060006003905060006c064f964e68233a76f52000000090506c0c9f2c9cd04674edea40000000600681905550606460018262000210919062000ae2565b6200021c919062000aaa565b600a81905550606460018262000233919062000ae2565b6200023f919062000aaa565b600b819055506103e860018262000257919062000ae2565b62000263919062000aaa565b600c8190555083600f819055508260108190555081601181905550601154601054600f5462000293919062000a4d565b6200029f919062000a4d565b600e81905550620002b5620005cd60201b60201c565b600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200031762000309620005cd60201b60201c565b6001620005f760201b60201c565b6200032a306001620005f760201b60201c565b6200033f61dead6001620005f760201b60201c565b6001601c600062000355620005cd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601c60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601c600061dead73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555030601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555030601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506032601881905550620004f433826200074960201b60201c565b505050505062000c88565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b62000607620004ff60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480620006ac57506200066e620004ff60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000694620005cd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16145b620006ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006e590620009db565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620007bc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007b390620009fd565b60405180910390fd5b620007d060008383620008c260201b60201c565b8060026000828254620007e4919062000a4d565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200083b919062000a4d565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620008a2919062000a1f565b60405180910390a3620008be60008383620008c760201b60201c565b5050565b505050565b505050565b828054620008da9062000b4d565b90600052602060002090601f016020900481019282620008fe57600085556200094a565b82601f106200091957805160ff19168380011785556200094a565b828001600101855582156200094a579182015b82811115620009495782518255916020019190600101906200092c565b5b5090506200095991906200095d565b5090565b5b80821115620009785760008160009055506001016200095e565b5090565b60006200098b60358362000a3c565b9150620009988262000c10565b604082019050919050565b6000620009b2601f8362000a3c565b9150620009bf8262000c5f565b602082019050919050565b620009d58162000b43565b82525050565b60006020820190508181036000830152620009f6816200097c565b9050919050565b6000602082019050818103600083015262000a1881620009a3565b9050919050565b600060208201905062000a366000830184620009ca565b92915050565b600082825260208201905092915050565b600062000a5a8262000b43565b915062000a678362000b43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000a9f5762000a9e62000b83565b5b828201905092915050565b600062000ab78262000b43565b915062000ac48362000b43565b92508262000ad75762000ad662000bb2565b5b828204905092915050565b600062000aef8262000b43565b915062000afc8362000b43565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000b385762000b3762000b83565b5b828202905092915050565b6000819050919050565b6000600282049050600182168062000b6657607f821691505b6020821081141562000b7d5762000b7c62000be1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660008201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b615c4c8062000c986000396000f3fe60806040526004361061028c5760003560e01c8063715018a61161015a578063c0246668116100c1578063d5abeb011161007a578063d5abeb01146109f4578063dd62ed3e14610a1f578063df778d2614610a5c578063f2fde38b14610a73578063f7c618c114610a9c578063f8b45b0514610ac757610293565b8063c02466681461090a578063c69bebe414610933578063c8c8ebe41461095c578063cef8513914610987578063d125ca18146109b2578063d54ad2a1146109c957610293565b80638baa63b2116101135780638baa63b2146107c05780638da5cb5b146107fd57806395d89b4114610828578063a39b215314610853578063a457c2d714610890578063a9059cbb146108cd57610293565b8063715018a6146106fc57806372f702f314610713578063751039fc1461073e5780637b0472f014610755578063817b1cd21461077e5780638a8c523c146107a957610293565b8063379607f5116101fe5780634ada218b116101b75780634ada218b146105c45780634fbee193146105ef57806357ded9c91461062c578063590654e9146106575780636ceb23a11461068257806370a08231146106bf57610293565b8063379607f5146104b657806339509351146104df5780633b51e5cf1461051c5780633dd5b2da146105455780634093e7d51461055c5780634a62bb651461059957610293565b80632242908511610250578063224290851461038157806323b872dd146103aa578063245fc1ba146103e75780632e17de7814610424578063313ce5671461044d57806335aa2e441461047857610293565b806306fdde0314610298578063095ea7b3146102c357806313114a9d1461030057806318160ddd1461032b5780631cfff51b1461035657610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610af2565b6040516102ba9190614d28565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e591906145b1565b610b84565b6040516102f79190614d0d565b60405180910390f35b34801561030c57600080fd5b50610315610ba7565b60405161032291906150ac565b60405180910390f35b34801561033757600080fd5b50610340610bad565b60405161034d91906150ac565b60405180910390f35b34801561036257600080fd5b5061036b610bb7565b6040516103789190614d0d565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a3919061468b565b610bca565b005b3480156103b657600080fd5b506103d160048036038101906103cc919061451e565b610cc9565b6040516103de9190614d0d565b60405180910390f35b3480156103f357600080fd5b5061040e600480360381019061040991906145b1565b610cf8565b60405161041b9190614d0d565b60405180910390f35b34801561043057600080fd5b5061044b6004803603810190610446919061461e565b610da4565b005b34801561045957600080fd5b50610462611184565b60405161046f919061514a565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a919061461e565b61118d565b6040516104ad929190615121565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d8919061461e565b6111c1565b005b3480156104eb57600080fd5b50610506600480360381019061050191906145b1565b61145d565b6040516105139190614d0d565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e91906145f1565b611507565b005b34801561055157600080fd5b5061055a6115ff565b005b34801561056857600080fd5b50610583600480360381019061057e91906145b1565b61166a565b60405161059091906150ac565b60405180910390f35b3480156105a557600080fd5b506105ae611702565b6040516105bb9190614d0d565b60405180910390f35b3480156105d057600080fd5b506105d9611715565b6040516105e69190614d0d565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190614484565b611728565b6040516106239190614d0d565b60405180910390f35b34801561063857600080fd5b5061064161177e565b60405161064e91906150ac565b60405180910390f35b34801561066357600080fd5b5061066c611784565b60405161067991906150ac565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190614484565b611791565b6040516106b6919061508a565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190614484565b61189a565b6040516106f391906150ac565b60405180910390f35b34801561070857600080fd5b506107116118e2565b005b34801561071f57600080fd5b5061072861196a565b6040516107359190614c91565b60405180910390f35b34801561074a57600080fd5b50610753611990565b005b34801561076157600080fd5b5061077c6004803603810190610777919061464b565b611a88565b005b34801561078a57600080fd5b50610793611dc0565b6040516107a091906150ac565b60405180910390f35b3480156107b557600080fd5b506107be611dc6565b005b3480156107cc57600080fd5b506107e760048036038101906107e2919061461e565b611f0e565b6040516107f49190614d0d565b60405180910390f35b34801561080957600080fd5b506108126120c2565b60405161081f9190614c91565b60405180910390f35b34801561083457600080fd5b5061083d6120ec565b60405161084a9190614d28565b60405180910390f35b34801561085f57600080fd5b5061087a600480360381019061087591906145b1565b61217e565b60405161088791906150ac565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b291906145b1565b6121dc565b6040516108c49190614d0d565b60405180910390f35b3480156108d957600080fd5b506108f460048036038101906108ef91906145b1565b6122c6565b6040516109019190614d0d565b60405180910390f35b34801561091657600080fd5b50610931600480360381019061092c9190614571565b6122e9565b005b34801561093f57600080fd5b5061095a60048036038101906109559190614484565b61241f565b005b34801561096857600080fd5b5061097161253e565b60405161097e91906150ac565b60405180910390f35b34801561099357600080fd5b5061099c612544565b6040516109a991906150ac565b60405180910390f35b3480156109be57600080fd5b506109c761254a565b005b3480156109d557600080fd5b506109de612684565b6040516109eb91906150ac565b60405180910390f35b348015610a0057600080fd5b50610a0961268a565b604051610a1691906150ac565b60405180910390f35b348015610a2b57600080fd5b50610a466004803603810190610a4191906144de565b612690565b604051610a5391906150ac565b60405180910390f35b348015610a6857600080fd5b50610a71612717565b005b348015610a7f57600080fd5b50610a9a6004803603810190610a959190614484565b612805565b005b348015610aa857600080fd5b50610ab16128fd565b604051610abe9190614c91565b60405180910390f35b348015610ad357600080fd5b50610adc612923565b604051610ae991906150ac565b60405180910390f35b606060038054610b01906153a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d906153a2565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905090565b600080610b8f612929565b9050610b9c818585612931565b600191505092915050565b600e5481565b6000600254905090565b601960009054906101000a900460ff1681565b610bd2612929565b73ffffffffffffffffffffffffffffffffffffffff16610bf06120c2565b73ffffffffffffffffffffffffffffffffffffffff1614610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d90614f4a565b60405180910390fd5b82600f819055508160108190555080601181905550601154601054600f54610c6e91906151f3565b610c7891906151f3565b600e819055506006600e541115610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90614e8a565b60405180910390fd5b505050565b600080610cd4612929565b9050610ce1858285612afc565b610cec858585612b88565b60019150509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff16601f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b610dae3382610cf8565b610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490614f6a565b60405180910390fd5b6000610df9338361166a565b9050600654610e1882610e0a610bad565b61363a90919063ffffffff16565b108015610e315750601960009054906101000a900460ff165b15610f9557602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a6000828254610f1a91906151f3565b92505081905550610f9033610f8b83601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015461363a90919063ffffffff16565b613650565b610ff3565b610ff233601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060020154613650565b5b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201546021838154811061105b5761105a615461565b5b9060005260206000209060020201600101600082825461107b91906152d4565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154601560008282546110e791906152d4565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055600382016000905550505050565b60006012905090565b6021818154811061119d57600080fd5b90600052602060002090600202016000915090508060000154908060010154905082565b601960009054906101000a900460ff16611210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120790614f2a565b60405180910390fd5b61121a3382610cf8565b611259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125090614f6a565b60405180910390fd5b600654611264610bad565b11156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90614d8a565b60405180910390fd5b60006112b1338361166a565b9050602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a600082825461139791906151f3565b925050819055506113a83382613650565b42601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600101819055506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600301819055505050565b600080611468612929565b90506114fc818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114f791906151f3565b612931565b600191505092915050565b61150f612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806115a3575061156d612929565b73ffffffffffffffffffffffffffffffffffffffff1661158b6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6115e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d990614eaa565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611667573d6000803e3d6000fd5b50565b60008061167784846137b0565b90506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060030154905060008111156116f6576116ed818361363a90919063ffffffff16565b925050506116fc565b81925050505b92915050565b600d60009054906101000a900460ff1681565b600d60019054906101000a900460ff1681565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60185481565b6000602180549050905090565b611799614401565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820180548060200260200160405190810160405280929190818152602001828054801561183257602002820191906000526020600020905b81548152602001906001019080831161181e575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561188a57602002820191906000526020600020905b815481526020019060010190808311611876575b5050505050815250509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118ea612929565b73ffffffffffffffffffffffffffffffffffffffff166119086120c2565b73ffffffffffffffffffffffffffffffffffffffff161461195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590614f4a565b60405180910390fd5b6119686000613948565b565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611998612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611a2c57506119f6612929565b73ffffffffffffffffffffffffffffffffffffffff16611a146120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b611a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6290614eaa565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b601960009054906101000a900460ff16611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90614f2a565b60405180910390fd5b600654611ae2610bad565b1115611b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1a90614d8a565b60405180910390fd5b611b2d3382610cf8565b15611c6c5781601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206002016000828254611b9591906151f3565b92505081905550611ba633826137b0565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206003016000828254611c0891906151f3565b9250508190555042601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010181905550611d5d565b60405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018381526020016000815250601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301559050505b8160218281548110611d7257611d71615461565b5b90600052602060002090600202016001016000828254611d9291906151f3565b925050819055508160156000828254611dab91906151f3565b92505081905550611dbc3383613a0e565b5050565b60155481565b611dce612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611e625750611e2c612929565b73ffffffffffffffffffffffffffffffffffffffff16611e4a6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9890614eaa565b60405180910390fd5b600d60019054906101000a900460ff1615611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee890614f0a565b60405180910390fd5b6001600d60016101000a81548160ff021916908315150217905550565b6000611f18612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611fac5750611f76612929565b73ffffffffffffffffffffffffffffffffffffffff16611f946120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614eaa565b60405180910390fd5b620186a06001611ff9610bad565b612003919061527a565b61200d9190615249565b82101561204f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204690614e6a565b60405180910390fd5b6103e8600561205c610bad565b612066919061527a565b6120709190615249565b8211156120b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a990614e4a565b60405180910390fd5b81600c8190555060019050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546120fb906153a2565b80601f0160208091040260200160405190810160405280929190818152602001828054612127906153a2565b80156121745780601f1061214957610100808354040283529160200191612174565b820191906000526020600020905b81548152906001019060200180831161215757829003601f168201915b5050505050905090565b6000601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154905092915050565b6000806121e7612929565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156122ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a49061504a565b60405180910390fd5b6122ba8286868403612931565b60019250505092915050565b6000806122d1612929565b90506122de818585612b88565b600191505092915050565b6122f1612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612385575061234f612929565b73ffffffffffffffffffffffffffffffffffffffff1661236d6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb90614eaa565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612427612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806124bb5750612485612929565b73ffffffffffffffffffffffffffffffffffffffff166124a36120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6124fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f190614eaa565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600c5481565b612552612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806125e657506125b0612929565b73ffffffffffffffffffffffffffffffffffffffff166125ce6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b612625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261c90614eaa565b60405180910390fd5b600060405180604001604052804281526020016000815250905060218190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505050565b601a5481565b60065481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61271f612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806127b3575061277d612929565b73ffffffffffffffffffffffffffffffffffffffff1661279b6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6127f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e990614eaa565b60405180910390fd5b6128036127fe3061189a565b613be5565b565b61280d612929565b73ffffffffffffffffffffffffffffffffffffffff1661282b6120c2565b73ffffffffffffffffffffffffffffffffffffffff1614612881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287890614f4a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e890614dca565b60405180910390fd5b6128fa81613948565b50565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299890614fea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0890614dea565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612aef91906150ac565b60405180910390a3505050565b6000612b088484612690565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612b825781811015612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90614e0a565b60405180910390fd5b612b818484848403612931565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bef90614fca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5f90614d6a565b60405180910390fd5b6000811415612c8257612c7d83836000613e37565b613635565b600d60009054906101000a900460ff161561325457612c9f6120c2565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d0d5750612cdd6120c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d47575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d605750600860149054906101000a900460ff16155b1561325357612d6d6120c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612df65750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612e505750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612f6a57600d60019054906101000a900460ff16612ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9b90614eea565b60405180910390fd5b43601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1c90614eca565b60405180910390fd5b43601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561300d5750601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130b457600a54811115613057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304e9061500a565b60405180910390fd5b600b546130638361189a565b8261306e91906151f3565b11156130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a69061502a565b60405180910390fd5b613252565b601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156131575750601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156131a657600a548111156131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614faa565b60405180910390fd5b613251565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661325057600b546132038361189a565b8261320e91906151f3565b111561324f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132469061502a565b60405180910390fd5b5b5b5b5b5b600061325f3061189a565b90506000600c5482101590508080156132855750600860149054906101000a900460ff16155b80156132db5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133315750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133875750601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156133cb576001600860146101000a81548160ff0219169083151502179055506133af6140b8565b6000600860146101000a81548160ff0219169083151502179055505b6000600860149054906101000a900460ff16159050601b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806134815750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061352c5750601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561352b5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b1561353657600090505b60008115613625576135666064613558600e54886142a690919063ffffffff16565b6142bc90919063ffffffff16565b9050600e5460105482613579919061527a565b6135839190615249565b6013600082825461359491906151f3565b92505081905550600e54601154826135ac919061527a565b6135b69190615249565b601460008282546135c791906151f3565b92505081905550600e54600f54826135df919061527a565b6135e99190615249565b601260008282546135fa91906151f3565b92505081905550600081111561361657613615873083613e37565b5b808561362291906152d4565b94505b613630878787613e37565b505050505b505050565b6000818361364891906151f3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b79061506a565b60405180910390fd5b6136cc600083836142d2565b80600260008282546136de91906151f3565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461373391906151f3565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161379891906150ac565b60405180910390a36137ac600083836142d7565b5050565b60006137bc8383610cf8565b6137fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f290614d4a565b60405180910390fd5b6000613807848461217e565b905060006138726001601f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600101546142bc90919063ffffffff16565b9050600061388a6001426142bc90919063ffffffff16565b905060006138a183836142dc90919063ffffffff16565b905060006138cd60646138bf601854886142a690919063ffffffff16565b6142bc90919063ffffffff16565b9050600061391f603c613911603c61390360186138f561016d896142bc90919063ffffffff16565b6142bc90919063ffffffff16565b6142bc90919063ffffffff16565b6142bc90919063ffffffff16565b9050600061393684836142a690919063ffffffff16565b90508097505050505050505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7590614f8a565b60405180910390fd5b613a8a826000836142d2565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0790614daa565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254613b6791906152d4565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613bcc91906150ac565b60405180910390a3613be0836000846142d7565b505050565b6000600267ffffffffffffffff811115613c0257613c01615490565b5b604051908082528060200260200182016040528015613c305781602001602082028036833780820191505090505b5090503081600081518110613c4857613c47615461565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613cea57600080fd5b505afa158015613cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d2291906144b1565b81600181518110613d3657613d35615461565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613d9d30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612931565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613e019594939291906150c7565b600060405180830381600087803b158015613e1b57600080fd5b505af1158015613e2f573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e9e90614fca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f0e90614d6a565b60405180910390fd5b613f228383836142d2565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f9f90614e2a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461403b91906151f3565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161409f91906150ac565b60405180910390a36140b28484846142d7565b50505050565b60006140c33061189a565b905060006014546012546013546140da91906151f3565b6140e491906151f3565b905060008214806140f55750600081145b156141015750506142a4565b600c5482111561411157600c5491505b600060028260135485614124919061527a565b61412e9190615249565b6141389190615249565b9050600061414f82856142dc90919063ffffffff16565b9050600047905061415f82613be5565b600061417482476142dc90919063ffffffff16565b9050600061419f86614191601254856142a690919063ffffffff16565b6142bc90919063ffffffff16565b905060006141ca876141bc601454866142a690919063ffffffff16565b6142bc90919063ffffffff16565b905060008183856141db91906152d4565b6141e591906152d4565b9050600060138190555060006012819055506000601481905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61424e848661363a90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015614279573d6000803e3d6000fd5b5060008711801561428a5750600081115b1561429a5761429987826142f2565b5b5050505050505050505b565b600081836142b4919061527a565b905092915050565b600081836142ca9190615249565b905092915050565b505050565b505050565b600081836142ea91906152d4565b905092915050565b61431f30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612931565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b81526004016143a896959493929190614cac565b6060604051808303818588803b1580156143c157600080fd5b505af11580156143d5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906143fa91906146de565b5050505050565b604051806040016040528060608152602001606081525090565b60008135905061442a81615bd1565b92915050565b60008151905061443f81615bd1565b92915050565b60008135905061445481615be8565b92915050565b60008135905061446981615bff565b92915050565b60008151905061447e81615bff565b92915050565b60006020828403121561449a576144996154bf565b5b60006144a88482850161441b565b91505092915050565b6000602082840312156144c7576144c66154bf565b5b60006144d584828501614430565b91505092915050565b600080604083850312156144f5576144f46154bf565b5b60006145038582860161441b565b92505060206145148582860161441b565b9150509250929050565b600080600060608486031215614537576145366154bf565b5b60006145458682870161441b565b93505060206145568682870161441b565b92505060406145678682870161445a565b9150509250925092565b60008060408385031215614588576145876154bf565b5b60006145968582860161441b565b92505060206145a785828601614445565b9150509250929050565b600080604083850312156145c8576145c76154bf565b5b60006145d68582860161441b565b92505060206145e78582860161445a565b9150509250929050565b600060208284031215614607576146066154bf565b5b600061461584828501614445565b91505092915050565b600060208284031215614634576146336154bf565b5b60006146428482850161445a565b91505092915050565b60008060408385031215614662576146616154bf565b5b60006146708582860161445a565b92505060206146818582860161445a565b9150509250929050565b6000806000606084860312156146a4576146a36154bf565b5b60006146b28682870161445a565b93505060206146c38682870161445a565b92505060406146d48682870161445a565b9150509250925092565b6000806000606084860312156146f7576146f66154bf565b5b60006147058682870161446f565b93505060206147168682870161446f565b92505060406147278682870161446f565b9150509250925092565b600061473d8383614761565b60208301905092915050565b60006147558383614c64565b60208301905092915050565b61476a81615308565b82525050565b61477981615308565b82525050565b600061478a82615185565b61479481856151c0565b935061479f83615165565b8060005b838110156147d05781516147b78882614731565b97506147c2836151a6565b9250506001810190506147a3565b5085935050505092915050565b60006147e882615190565b6147f281856151d1565b93506147fd83615175565b8060005b8381101561482e5781516148158882614749565b9750614820836151b3565b925050600181019050614801565b5085935050505092915050565b6148448161531a565b82525050565b6148538161535d565b82525050565b60006148648261519b565b61486e81856151e2565b935061487e81856020860161536f565b614887816154c4565b840191505092915050565b600061489f6014836151e2565b91506148aa826154d5565b602082019050919050565b60006148c26023836151e2565b91506148cd826154fe565b604082019050919050565b60006148e5602d836151e2565b91506148f08261554d565b604082019050919050565b60006149086022836151e2565b91506149138261559c565b604082019050919050565b600061492b6026836151e2565b9150614936826155eb565b604082019050919050565b600061494e6022836151e2565b91506149598261563a565b604082019050919050565b6000614971601d836151e2565b915061497c82615689565b602082019050919050565b60006149946026836151e2565b915061499f826156b2565b604082019050919050565b60006149b76037836151e2565b91506149c282615701565b604082019050919050565b60006149da6038836151e2565b91506149e582615750565b604082019050919050565b60006149fd601c836151e2565b9150614a088261579f565b602082019050919050565b6000614a206035836151e2565b9150614a2b826157c8565b604082019050919050565b6000614a436049836151e2565b9150614a4e82615817565b606082019050919050565b6000614a666017836151e2565b9150614a718261588c565b602082019050919050565b6000614a896015836151e2565b9150614a94826158b5565b602082019050919050565b6000614aac6017836151e2565b9150614ab7826158de565b602082019050919050565b6000614acf6020836151e2565b9150614ada82615907565b602082019050919050565b6000614af26015836151e2565b9150614afd82615930565b602082019050919050565b6000614b156021836151e2565b9150614b2082615959565b604082019050919050565b6000614b386042836151e2565b9150614b43826159a8565b606082019050919050565b6000614b5b6025836151e2565b9150614b6682615a1d565b604082019050919050565b6000614b7e6024836151e2565b9150614b8982615a6c565b604082019050919050565b6000614ba16041836151e2565b9150614bac82615abb565b606082019050919050565b6000614bc4601f836151e2565b9150614bcf82615b30565b602082019050919050565b6000614be76025836151e2565b9150614bf282615b59565b604082019050919050565b6000614c0a601f836151e2565b9150614c1582615ba8565b602082019050919050565b60006040830160008301518482036000860152614c3d82826147dd565b91505060208301518482036020860152614c5782826147dd565b9150508091505092915050565b614c6d81615346565b82525050565b614c7c81615346565b82525050565b614c8b81615350565b82525050565b6000602082019050614ca66000830184614770565b92915050565b600060c082019050614cc16000830189614770565b614cce6020830188614c73565b614cdb604083018761484a565b614ce8606083018661484a565b614cf56080830185614770565b614d0260a0830184614c73565b979650505050505050565b6000602082019050614d22600083018461483b565b92915050565b60006020820190508181036000830152614d428184614859565b905092915050565b60006020820190508181036000830152614d6381614892565b9050919050565b60006020820190508181036000830152614d83816148b5565b9050919050565b60006020820190508181036000830152614da3816148d8565b9050919050565b60006020820190508181036000830152614dc3816148fb565b9050919050565b60006020820190508181036000830152614de38161491e565b9050919050565b60006020820190508181036000830152614e0381614941565b9050919050565b60006020820190508181036000830152614e2381614964565b9050919050565b60006020820190508181036000830152614e4381614987565b9050919050565b60006020820190508181036000830152614e63816149aa565b9050919050565b60006020820190508181036000830152614e83816149cd565b9050919050565b60006020820190508181036000830152614ea3816149f0565b9050919050565b60006020820190508181036000830152614ec381614a13565b9050919050565b60006020820190508181036000830152614ee381614a36565b9050919050565b60006020820190508181036000830152614f0381614a59565b9050919050565b60006020820190508181036000830152614f2381614a7c565b9050919050565b60006020820190508181036000830152614f4381614a9f565b9050919050565b60006020820190508181036000830152614f6381614ac2565b9050919050565b60006020820190508181036000830152614f8381614ae5565b9050919050565b60006020820190508181036000830152614fa381614b08565b9050919050565b60006020820190508181036000830152614fc381614b2b565b9050919050565b60006020820190508181036000830152614fe381614b4e565b9050919050565b6000602082019050818103600083015261500381614b71565b9050919050565b6000602082019050818103600083015261502381614b94565b9050919050565b6000602082019050818103600083015261504381614bb7565b9050919050565b6000602082019050818103600083015261506381614bda565b9050919050565b6000602082019050818103600083015261508381614bfd565b9050919050565b600060208201905081810360008301526150a48184614c20565b905092915050565b60006020820190506150c16000830184614c73565b92915050565b600060a0820190506150dc6000830188614c73565b6150e9602083018761484a565b81810360408301526150fb818661477f565b905061510a6060830185614770565b6151176080830184614c73565b9695505050505050565b60006040820190506151366000830185614c73565b6151436020830184614c73565b9392505050565b600060208201905061515f6000830184614c82565b92915050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006151fe82615346565b915061520983615346565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561523e5761523d6153d4565b5b828201905092915050565b600061525482615346565b915061525f83615346565b92508261526f5761526e615403565b5b828204905092915050565b600061528582615346565b915061529083615346565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152c9576152c86153d4565b5b828202905092915050565b60006152df82615346565b91506152ea83615346565b9250828210156152fd576152fc6153d4565b5b828203905092915050565b600061531382615326565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061536882615346565b9050919050565b60005b8381101561538d578082015181840152602081019050615372565b8381111561539c576000848401525b50505050565b600060028204905060018216806153ba57607f821691505b602082108114156153ce576153cd615432565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f55736572206973206e6f74207374616b696e672e000000000000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f546865726520617265206e6f206d6f72652072657761726473206c656674207460008201527f6f20626520636c61696d65642e00000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f53776170207468726573686f6c642063616e6e6f74206265206869676865722060008201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000602082015250565b7f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460008201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000602082015250565b7f4d757374206b6565702066656573206174203625206f72206c65737300000000600082015250565b7f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660008201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000602082015250565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b7f54726164696e67206973206e6f7420656e61626c65642e000000000000000000600082015250565b7f43616e206f6e6c7920656e61626c65206f6e63652e0000000000000000000000600082015250565b7f5374616b696e67206973206e6f7420656e61626c65642e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f7520617265206e6f74207374616b696e67213f0000000000000000000000600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460008201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e60208201527f742e000000000000000000000000000000000000000000000000000000000000604082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060008201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e7460208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b7f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b615bda81615308565b8114615be557600080fd5b50565b615bf18161531a565b8114615bfc57600080fd5b50565b615c0881615346565b8114615c1357600080fd5b5056fea2646970667358221220e3735902f995326fcd605c90007226809c414eeae3fe70ecddbae12387e2291d64736f6c63430008070033
Deployed Bytecode
0x60806040526004361061028c5760003560e01c8063715018a61161015a578063c0246668116100c1578063d5abeb011161007a578063d5abeb01146109f4578063dd62ed3e14610a1f578063df778d2614610a5c578063f2fde38b14610a73578063f7c618c114610a9c578063f8b45b0514610ac757610293565b8063c02466681461090a578063c69bebe414610933578063c8c8ebe41461095c578063cef8513914610987578063d125ca18146109b2578063d54ad2a1146109c957610293565b80638baa63b2116101135780638baa63b2146107c05780638da5cb5b146107fd57806395d89b4114610828578063a39b215314610853578063a457c2d714610890578063a9059cbb146108cd57610293565b8063715018a6146106fc57806372f702f314610713578063751039fc1461073e5780637b0472f014610755578063817b1cd21461077e5780638a8c523c146107a957610293565b8063379607f5116101fe5780634ada218b116101b75780634ada218b146105c45780634fbee193146105ef57806357ded9c91461062c578063590654e9146106575780636ceb23a11461068257806370a08231146106bf57610293565b8063379607f5146104b657806339509351146104df5780633b51e5cf1461051c5780633dd5b2da146105455780634093e7d51461055c5780634a62bb651461059957610293565b80632242908511610250578063224290851461038157806323b872dd146103aa578063245fc1ba146103e75780632e17de7814610424578063313ce5671461044d57806335aa2e441461047857610293565b806306fdde0314610298578063095ea7b3146102c357806313114a9d1461030057806318160ddd1461032b5780631cfff51b1461035657610293565b3661029357005b600080fd5b3480156102a457600080fd5b506102ad610af2565b6040516102ba9190614d28565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e591906145b1565b610b84565b6040516102f79190614d0d565b60405180910390f35b34801561030c57600080fd5b50610315610ba7565b60405161032291906150ac565b60405180910390f35b34801561033757600080fd5b50610340610bad565b60405161034d91906150ac565b60405180910390f35b34801561036257600080fd5b5061036b610bb7565b6040516103789190614d0d565b60405180910390f35b34801561038d57600080fd5b506103a860048036038101906103a3919061468b565b610bca565b005b3480156103b657600080fd5b506103d160048036038101906103cc919061451e565b610cc9565b6040516103de9190614d0d565b60405180910390f35b3480156103f357600080fd5b5061040e600480360381019061040991906145b1565b610cf8565b60405161041b9190614d0d565b60405180910390f35b34801561043057600080fd5b5061044b6004803603810190610446919061461e565b610da4565b005b34801561045957600080fd5b50610462611184565b60405161046f919061514a565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a919061461e565b61118d565b6040516104ad929190615121565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d8919061461e565b6111c1565b005b3480156104eb57600080fd5b50610506600480360381019061050191906145b1565b61145d565b6040516105139190614d0d565b60405180910390f35b34801561052857600080fd5b50610543600480360381019061053e91906145f1565b611507565b005b34801561055157600080fd5b5061055a6115ff565b005b34801561056857600080fd5b50610583600480360381019061057e91906145b1565b61166a565b60405161059091906150ac565b60405180910390f35b3480156105a557600080fd5b506105ae611702565b6040516105bb9190614d0d565b60405180910390f35b3480156105d057600080fd5b506105d9611715565b6040516105e69190614d0d565b60405180910390f35b3480156105fb57600080fd5b5061061660048036038101906106119190614484565b611728565b6040516106239190614d0d565b60405180910390f35b34801561063857600080fd5b5061064161177e565b60405161064e91906150ac565b60405180910390f35b34801561066357600080fd5b5061066c611784565b60405161067991906150ac565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a49190614484565b611791565b6040516106b6919061508a565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e19190614484565b61189a565b6040516106f391906150ac565b60405180910390f35b34801561070857600080fd5b506107116118e2565b005b34801561071f57600080fd5b5061072861196a565b6040516107359190614c91565b60405180910390f35b34801561074a57600080fd5b50610753611990565b005b34801561076157600080fd5b5061077c6004803603810190610777919061464b565b611a88565b005b34801561078a57600080fd5b50610793611dc0565b6040516107a091906150ac565b60405180910390f35b3480156107b557600080fd5b506107be611dc6565b005b3480156107cc57600080fd5b506107e760048036038101906107e2919061461e565b611f0e565b6040516107f49190614d0d565b60405180910390f35b34801561080957600080fd5b506108126120c2565b60405161081f9190614c91565b60405180910390f35b34801561083457600080fd5b5061083d6120ec565b60405161084a9190614d28565b60405180910390f35b34801561085f57600080fd5b5061087a600480360381019061087591906145b1565b61217e565b60405161088791906150ac565b60405180910390f35b34801561089c57600080fd5b506108b760048036038101906108b291906145b1565b6121dc565b6040516108c49190614d0d565b60405180910390f35b3480156108d957600080fd5b506108f460048036038101906108ef91906145b1565b6122c6565b6040516109019190614d0d565b60405180910390f35b34801561091657600080fd5b50610931600480360381019061092c9190614571565b6122e9565b005b34801561093f57600080fd5b5061095a60048036038101906109559190614484565b61241f565b005b34801561096857600080fd5b5061097161253e565b60405161097e91906150ac565b60405180910390f35b34801561099357600080fd5b5061099c612544565b6040516109a991906150ac565b60405180910390f35b3480156109be57600080fd5b506109c761254a565b005b3480156109d557600080fd5b506109de612684565b6040516109eb91906150ac565b60405180910390f35b348015610a0057600080fd5b50610a0961268a565b604051610a1691906150ac565b60405180910390f35b348015610a2b57600080fd5b50610a466004803603810190610a4191906144de565b612690565b604051610a5391906150ac565b60405180910390f35b348015610a6857600080fd5b50610a71612717565b005b348015610a7f57600080fd5b50610a9a6004803603810190610a959190614484565b612805565b005b348015610aa857600080fd5b50610ab16128fd565b604051610abe9190614c91565b60405180910390f35b348015610ad357600080fd5b50610adc612923565b604051610ae991906150ac565b60405180910390f35b606060038054610b01906153a2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2d906153a2565b8015610b7a5780601f10610b4f57610100808354040283529160200191610b7a565b820191906000526020600020905b815481529060010190602001808311610b5d57829003601f168201915b5050505050905090565b600080610b8f612929565b9050610b9c818585612931565b600191505092915050565b600e5481565b6000600254905090565b601960009054906101000a900460ff1681565b610bd2612929565b73ffffffffffffffffffffffffffffffffffffffff16610bf06120c2565b73ffffffffffffffffffffffffffffffffffffffff1614610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d90614f4a565b60405180910390fd5b82600f819055508160108190555080601181905550601154601054600f54610c6e91906151f3565b610c7891906151f3565b600e819055506006600e541115610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90614e8a565b60405180910390fd5b505050565b600080610cd4612929565b9050610ce1858285612afc565b610cec858585612b88565b60019150509392505050565b60008273ffffffffffffffffffffffffffffffffffffffff16601f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b610dae3382610cf8565b610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490614f6a565b60405180910390fd5b6000610df9338361166a565b9050600654610e1882610e0a610bad565b61363a90919063ffffffff16565b108015610e315750601960009054906101000a900460ff165b15610f9557602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a6000828254610f1a91906151f3565b92505081905550610f9033610f8b83601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000206002015461363a90919063ffffffff16565b613650565b610ff3565b610ff233601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060020154613650565b5b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201546021838154811061105b5761105a615461565b5b9060005260206000209060020201600101600082825461107b91906152d4565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154601560008282546110e791906152d4565b92505081905550601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160009055600382016000905550505050565b60006012905090565b6021818154811061119d57600080fd5b90600052602060002090600202016000915090508060000154908060010154905082565b601960009054906101000a900460ff16611210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120790614f2a565b60405180910390fd5b61121a3382610cf8565b611259576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125090614f6a565b60405180910390fd5b600654611264610bad565b11156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90614d8a565b60405180910390fd5b60006112b1338361166a565b9050602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001429080600181540180825580915050600190039060005260206000200160009091909190915055602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181908060018154018082558091505060019003906000526020600020016000909190919091505580601a600082825461139791906151f3565b925050819055506113a83382613650565b42601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600101819055506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600301819055505050565b600080611468612929565b90506114fc818585600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114f791906151f3565b612931565b600191505092915050565b61150f612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806115a3575061156d612929565b73ffffffffffffffffffffffffffffffffffffffff1661158b6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6115e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d990614eaa565b60405180910390fd5b80601960006101000a81548160ff02191690831515021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611667573d6000803e3d6000fd5b50565b60008061167784846137b0565b90506000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060030154905060008111156116f6576116ed818361363a90919063ffffffff16565b925050506116fc565b81925050505b92915050565b600d60009054906101000a900460ff1681565b600d60019054906101000a900460ff1681565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60185481565b6000602180549050905090565b611799614401565b602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820180548060200260200160405190810160405280929190818152602001828054801561183257602002820191906000526020600020905b81548152602001906001019080831161181e575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561188a57602002820191906000526020600020905b815481526020019060010190808311611876575b5050505050815250509050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118ea612929565b73ffffffffffffffffffffffffffffffffffffffff166119086120c2565b73ffffffffffffffffffffffffffffffffffffffff161461195e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195590614f4a565b60405180910390fd5b6119686000613948565b565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611998612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611a2c57506119f6612929565b73ffffffffffffffffffffffffffffffffffffffff16611a146120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b611a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6290614eaa565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b601960009054906101000a900460ff16611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace90614f2a565b60405180910390fd5b600654611ae2610bad565b1115611b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1a90614d8a565b60405180910390fd5b611b2d3382610cf8565b15611c6c5781601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206002016000828254611b9591906151f3565b92505081905550611ba633826137b0565b601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206003016000828254611c0891906151f3565b9250508190555042601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010181905550611d5d565b60405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020014281526020018381526020016000815250601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301559050505b8160218281548110611d7257611d71615461565b5b90600052602060002090600202016001016000828254611d9291906151f3565b925050819055508160156000828254611dab91906151f3565b92505081905550611dbc3383613a0e565b5050565b60155481565b611dce612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611e625750611e2c612929565b73ffffffffffffffffffffffffffffffffffffffff16611e4a6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b611ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9890614eaa565b60405180910390fd5b600d60019054906101000a900460ff1615611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee890614f0a565b60405180910390fd5b6001600d60016101000a81548160ff021916908315150217905550565b6000611f18612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611fac5750611f76612929565b73ffffffffffffffffffffffffffffffffffffffff16611f946120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614eaa565b60405180910390fd5b620186a06001611ff9610bad565b612003919061527a565b61200d9190615249565b82101561204f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204690614e6a565b60405180910390fd5b6103e8600561205c610bad565b612066919061527a565b6120709190615249565b8211156120b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a990614e4a565b60405180910390fd5b81600c8190555060019050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546120fb906153a2565b80601f0160208091040260200160405190810160405280929190818152602001828054612127906153a2565b80156121745780601f1061214957610100808354040283529160200191612174565b820191906000526020600020905b81548152906001019060200180831161215757829003601f168201915b5050505050905090565b6000601f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060020154905092915050565b6000806121e7612929565b90506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156122ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a49061504a565b60405180910390fd5b6122ba8286868403612931565b60019250505092915050565b6000806122d1612929565b90506122de818585612b88565b600191505092915050565b6122f1612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480612385575061234f612929565b73ffffffffffffffffffffffffffffffffffffffff1661236d6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb90614eaa565b60405180910390fd5b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b612427612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806124bb5750612485612929565b73ffffffffffffffffffffffffffffffffffffffff166124a36120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6124fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f190614eaa565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600c5481565b612552612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806125e657506125b0612929565b73ffffffffffffffffffffffffffffffffffffffff166125ce6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b612625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261c90614eaa565b60405180910390fd5b600060405180604001604052804281526020016000815250905060218190806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505050565b601a5481565b60065481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61271f612929565b73ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614806127b3575061277d612929565b73ffffffffffffffffffffffffffffffffffffffff1661279b6120c2565b73ffffffffffffffffffffffffffffffffffffffff16145b6127f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e990614eaa565b60405180910390fd5b6128036127fe3061189a565b613be5565b565b61280d612929565b73ffffffffffffffffffffffffffffffffffffffff1661282b6120c2565b73ffffffffffffffffffffffffffffffffffffffff1614612881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287890614f4a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156128f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e890614dca565b60405180910390fd5b6128fa81613948565b50565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299890614fea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0890614dea565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612aef91906150ac565b60405180910390a3505050565b6000612b088484612690565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612b825781811015612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90614e0a565b60405180910390fd5b612b818484848403612931565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bef90614fca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5f90614d6a565b60405180910390fd5b6000811415612c8257612c7d83836000613e37565b613635565b600d60009054906101000a900460ff161561325457612c9f6120c2565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d0d5750612cdd6120c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d47575061dead73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612d605750600860149054906101000a900460ff16155b1561325357612d6d6120c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015612df65750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015612e505750600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15612f6a57600d60019054906101000a900460ff16612ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9b90614eea565b60405180910390fd5b43601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410612f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1c90614eca565b60405180910390fd5b43601e60003273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b601d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561300d5750601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156130b457600a54811115613057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304e9061500a565b60405180910390fd5b600b546130638361189a565b8261306e91906151f3565b11156130af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a69061502a565b60405180910390fd5b613252565b601d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156131575750601c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156131a657600a548111156131a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319890614faa565b60405180910390fd5b613251565b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661325057600b546132038361189a565b8261320e91906151f3565b111561324f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132469061502a565b60405180910390fd5b5b5b5b5b5b600061325f3061189a565b90506000600c5482101590508080156132855750600860149054906101000a900460ff16155b80156132db5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133315750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156133875750601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156133cb576001600860146101000a81548160ff0219169083151502179055506133af6140b8565b6000600860146101000a81548160ff0219169083151502179055505b6000600860149054906101000a900460ff16159050601b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806134815750601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b8061352c5750601d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615801561352b5750601d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b5b1561353657600090505b60008115613625576135666064613558600e54886142a690919063ffffffff16565b6142bc90919063ffffffff16565b9050600e5460105482613579919061527a565b6135839190615249565b6013600082825461359491906151f3565b92505081905550600e54601154826135ac919061527a565b6135b69190615249565b601460008282546135c791906151f3565b92505081905550600e54600f54826135df919061527a565b6135e99190615249565b601260008282546135fa91906151f3565b92505081905550600081111561361657613615873083613e37565b5b808561362291906152d4565b94505b613630878787613e37565b505050505b505050565b6000818361364891906151f3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156136c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136b79061506a565b60405180910390fd5b6136cc600083836142d2565b80600260008282546136de91906151f3565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461373391906151f3565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161379891906150ac565b60405180910390a36137ac600083836142d7565b5050565b60006137bc8383610cf8565b6137fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f290614d4a565b60405180910390fd5b6000613807848461217e565b905060006138726001601f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878152602001908152602001600020600101546142bc90919063ffffffff16565b9050600061388a6001426142bc90919063ffffffff16565b905060006138a183836142dc90919063ffffffff16565b905060006138cd60646138bf601854886142a690919063ffffffff16565b6142bc90919063ffffffff16565b9050600061391f603c613911603c61390360186138f561016d896142bc90919063ffffffff16565b6142bc90919063ffffffff16565b6142bc90919063ffffffff16565b6142bc90919063ffffffff16565b9050600061393684836142a690919063ffffffff16565b90508097505050505050505092915050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7590614f8a565b60405180910390fd5b613a8a826000836142d2565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0790614daa565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254613b6791906152d4565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613bcc91906150ac565b60405180910390a3613be0836000846142d7565b505050565b6000600267ffffffffffffffff811115613c0257613c01615490565b5b604051908082528060200260200182016040528015613c305781602001602082028036833780820191505090505b5090503081600081518110613c4857613c47615461565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613cea57600080fd5b505afa158015613cfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d2291906144b1565b81600181518110613d3657613d35615461565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613d9d30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612931565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401613e019594939291906150c7565b600060405180830381600087803b158015613e1b57600080fd5b505af1158015613e2f573d6000803e3d6000fd5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e9e90614fca565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f0e90614d6a565b60405180910390fd5b613f228383836142d2565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f9f90614e2a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461403b91906151f3565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161409f91906150ac565b60405180910390a36140b28484846142d7565b50505050565b60006140c33061189a565b905060006014546012546013546140da91906151f3565b6140e491906151f3565b905060008214806140f55750600081145b156141015750506142a4565b600c5482111561411157600c5491505b600060028260135485614124919061527a565b61412e9190615249565b6141389190615249565b9050600061414f82856142dc90919063ffffffff16565b9050600047905061415f82613be5565b600061417482476142dc90919063ffffffff16565b9050600061419f86614191601254856142a690919063ffffffff16565b6142bc90919063ffffffff16565b905060006141ca876141bc601454866142a690919063ffffffff16565b6142bc90919063ffffffff16565b905060008183856141db91906152d4565b6141e591906152d4565b9050600060138190555060006012819055506000601481905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61424e848661363a90919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015614279573d6000803e3d6000fd5b5060008711801561428a5750600081115b1561429a5761429987826142f2565b5b5050505050505050505b565b600081836142b4919061527a565b905092915050565b600081836142ca9190615249565b905092915050565b505050565b505050565b600081836142ea91906152d4565b905092915050565b61431f30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612931565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719823085600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518863ffffffff1660e01b81526004016143a896959493929190614cac565b6060604051808303818588803b1580156143c157600080fd5b505af11580156143d5573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906143fa91906146de565b5050505050565b604051806040016040528060608152602001606081525090565b60008135905061442a81615bd1565b92915050565b60008151905061443f81615bd1565b92915050565b60008135905061445481615be8565b92915050565b60008135905061446981615bff565b92915050565b60008151905061447e81615bff565b92915050565b60006020828403121561449a576144996154bf565b5b60006144a88482850161441b565b91505092915050565b6000602082840312156144c7576144c66154bf565b5b60006144d584828501614430565b91505092915050565b600080604083850312156144f5576144f46154bf565b5b60006145038582860161441b565b92505060206145148582860161441b565b9150509250929050565b600080600060608486031215614537576145366154bf565b5b60006145458682870161441b565b93505060206145568682870161441b565b92505060406145678682870161445a565b9150509250925092565b60008060408385031215614588576145876154bf565b5b60006145968582860161441b565b92505060206145a785828601614445565b9150509250929050565b600080604083850312156145c8576145c76154bf565b5b60006145d68582860161441b565b92505060206145e78582860161445a565b9150509250929050565b600060208284031215614607576146066154bf565b5b600061461584828501614445565b91505092915050565b600060208284031215614634576146336154bf565b5b60006146428482850161445a565b91505092915050565b60008060408385031215614662576146616154bf565b5b60006146708582860161445a565b92505060206146818582860161445a565b9150509250929050565b6000806000606084860312156146a4576146a36154bf565b5b60006146b28682870161445a565b93505060206146c38682870161445a565b92505060406146d48682870161445a565b9150509250925092565b6000806000606084860312156146f7576146f66154bf565b5b60006147058682870161446f565b93505060206147168682870161446f565b92505060406147278682870161446f565b9150509250925092565b600061473d8383614761565b60208301905092915050565b60006147558383614c64565b60208301905092915050565b61476a81615308565b82525050565b61477981615308565b82525050565b600061478a82615185565b61479481856151c0565b935061479f83615165565b8060005b838110156147d05781516147b78882614731565b97506147c2836151a6565b9250506001810190506147a3565b5085935050505092915050565b60006147e882615190565b6147f281856151d1565b93506147fd83615175565b8060005b8381101561482e5781516148158882614749565b9750614820836151b3565b925050600181019050614801565b5085935050505092915050565b6148448161531a565b82525050565b6148538161535d565b82525050565b60006148648261519b565b61486e81856151e2565b935061487e81856020860161536f565b614887816154c4565b840191505092915050565b600061489f6014836151e2565b91506148aa826154d5565b602082019050919050565b60006148c26023836151e2565b91506148cd826154fe565b604082019050919050565b60006148e5602d836151e2565b91506148f08261554d565b604082019050919050565b60006149086022836151e2565b91506149138261559c565b604082019050919050565b600061492b6026836151e2565b9150614936826155eb565b604082019050919050565b600061494e6022836151e2565b91506149598261563a565b604082019050919050565b6000614971601d836151e2565b915061497c82615689565b602082019050919050565b60006149946026836151e2565b915061499f826156b2565b604082019050919050565b60006149b76037836151e2565b91506149c282615701565b604082019050919050565b60006149da6038836151e2565b91506149e582615750565b604082019050919050565b60006149fd601c836151e2565b9150614a088261579f565b602082019050919050565b6000614a206035836151e2565b9150614a2b826157c8565b604082019050919050565b6000614a436049836151e2565b9150614a4e82615817565b606082019050919050565b6000614a666017836151e2565b9150614a718261588c565b602082019050919050565b6000614a896015836151e2565b9150614a94826158b5565b602082019050919050565b6000614aac6017836151e2565b9150614ab7826158de565b602082019050919050565b6000614acf6020836151e2565b9150614ada82615907565b602082019050919050565b6000614af26015836151e2565b9150614afd82615930565b602082019050919050565b6000614b156021836151e2565b9150614b2082615959565b604082019050919050565b6000614b386042836151e2565b9150614b43826159a8565b606082019050919050565b6000614b5b6025836151e2565b9150614b6682615a1d565b604082019050919050565b6000614b7e6024836151e2565b9150614b8982615a6c565b604082019050919050565b6000614ba16041836151e2565b9150614bac82615abb565b606082019050919050565b6000614bc4601f836151e2565b9150614bcf82615b30565b602082019050919050565b6000614be76025836151e2565b9150614bf282615b59565b604082019050919050565b6000614c0a601f836151e2565b9150614c1582615ba8565b602082019050919050565b60006040830160008301518482036000860152614c3d82826147dd565b91505060208301518482036020860152614c5782826147dd565b9150508091505092915050565b614c6d81615346565b82525050565b614c7c81615346565b82525050565b614c8b81615350565b82525050565b6000602082019050614ca66000830184614770565b92915050565b600060c082019050614cc16000830189614770565b614cce6020830188614c73565b614cdb604083018761484a565b614ce8606083018661484a565b614cf56080830185614770565b614d0260a0830184614c73565b979650505050505050565b6000602082019050614d22600083018461483b565b92915050565b60006020820190508181036000830152614d428184614859565b905092915050565b60006020820190508181036000830152614d6381614892565b9050919050565b60006020820190508181036000830152614d83816148b5565b9050919050565b60006020820190508181036000830152614da3816148d8565b9050919050565b60006020820190508181036000830152614dc3816148fb565b9050919050565b60006020820190508181036000830152614de38161491e565b9050919050565b60006020820190508181036000830152614e0381614941565b9050919050565b60006020820190508181036000830152614e2381614964565b9050919050565b60006020820190508181036000830152614e4381614987565b9050919050565b60006020820190508181036000830152614e63816149aa565b9050919050565b60006020820190508181036000830152614e83816149cd565b9050919050565b60006020820190508181036000830152614ea3816149f0565b9050919050565b60006020820190508181036000830152614ec381614a13565b9050919050565b60006020820190508181036000830152614ee381614a36565b9050919050565b60006020820190508181036000830152614f0381614a59565b9050919050565b60006020820190508181036000830152614f2381614a7c565b9050919050565b60006020820190508181036000830152614f4381614a9f565b9050919050565b60006020820190508181036000830152614f6381614ac2565b9050919050565b60006020820190508181036000830152614f8381614ae5565b9050919050565b60006020820190508181036000830152614fa381614b08565b9050919050565b60006020820190508181036000830152614fc381614b2b565b9050919050565b60006020820190508181036000830152614fe381614b4e565b9050919050565b6000602082019050818103600083015261500381614b71565b9050919050565b6000602082019050818103600083015261502381614b94565b9050919050565b6000602082019050818103600083015261504381614bb7565b9050919050565b6000602082019050818103600083015261506381614bda565b9050919050565b6000602082019050818103600083015261508381614bfd565b9050919050565b600060208201905081810360008301526150a48184614c20565b905092915050565b60006020820190506150c16000830184614c73565b92915050565b600060a0820190506150dc6000830188614c73565b6150e9602083018761484a565b81810360408301526150fb818661477f565b905061510a6060830185614770565b6151176080830184614c73565b9695505050505050565b60006040820190506151366000830185614c73565b6151436020830184614c73565b9392505050565b600060208201905061515f6000830184614c82565b92915050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006151fe82615346565b915061520983615346565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561523e5761523d6153d4565b5b828201905092915050565b600061525482615346565b915061525f83615346565b92508261526f5761526e615403565b5b828204905092915050565b600061528582615346565b915061529083615346565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156152c9576152c86153d4565b5b828202905092915050565b60006152df82615346565b91506152ea83615346565b9250828210156152fd576152fc6153d4565b5b828203905092915050565b600061531382615326565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061536882615346565b9050919050565b60005b8381101561538d578082015181840152602081019050615372565b8381111561539c576000848401525b50505050565b600060028204905060018216806153ba57607f821691505b602082108114156153ce576153cd615432565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f55736572206973206e6f74207374616b696e672e000000000000000000000000600082015250565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f546865726520617265206e6f206d6f72652072657761726473206c656674207460008201527f6f20626520636c61696d65642e00000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f53776170207468726573686f6c642063616e6e6f74206265206869676865722060008201527f7468616e20302e352520746f74616c20737570706c792e000000000000000000602082015250565b7f53776170207468726573686f6c642063616e6e6f74206265206c6f776572207460008201527f68616e20302e3030312520746f74616c20737570706c792e0000000000000000602082015250565b7f4d757374206b6565702066656573206174203625206f72206c65737300000000600082015250565b7f43616c6c6572206973206e6f7420746865205f7377617046656552656365697660008201527f65722061646472657373206e6f72206f776e65722e0000000000000000000000602082015250565b7f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60008201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b60208201527f20616c6c6f7765642e0000000000000000000000000000000000000000000000604082015250565b7f54726164696e67206973206e6f7420656e61626c65642e000000000000000000600082015250565b7f43616e206f6e6c7920656e61626c65206f6e63652e0000000000000000000000600082015250565b7f5374616b696e67206973206e6f7420656e61626c65642e000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f596f7520617265206e6f74207374616b696e67213f0000000000000000000000600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5f7472616e736665723a3a2053656c6c207472616e7366657220616d6f756e7460008201527f206578636565647320746865206d61785472616e73616374696f6e416d6f756e60208201527f742e000000000000000000000000000000000000000000000000000000000000604082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f5f7472616e736665723a3a20427579207472616e7366657220616d6f756e742060008201527f6578636565647320746865206d61785472616e73616374696f6e416d6f756e7460208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b7f5f7472616e736665723a3a204d61782077616c6c657420657863656564656400600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b615bda81615308565b8114615be557600080fd5b50565b615bf18161531a565b8114615bfc57600080fd5b50565b615c0881615346565b8114615c1357600080fd5b5056fea2646970667358221220e3735902f995326fcd605c90007226809c414eeae3fe70ecddbae12387e2291d64736f6c63430008070033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.