Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
1,000,000,000 RUFF
Holders
113
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
1,141,239.341445908 RUFFValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
RuffRuff
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 5 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/** *Submitted for verification at BscScan.com on 2023-03-02 */ // SPDX-License-Identifier: Unlicensed pragma solidity 0.8.18; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; return msg.data; } } interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 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 (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 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 (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); 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 (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); 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(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint256) values; mapping(address => uint256) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) internal view returns (uint256) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) internal view returns (int256) { if (!map.inserted[key]) { return -1; } return int256(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint256 index) internal view returns (address) { return map.keys[index]; } function size(Map storage map) internal view returns (uint256) { return map.keys.length; } function set( Map storage map, address key, uint256 val ) internal { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) internal { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint256 index = map.indexOf[key]; uint256 lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, 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 sender, address recipient, 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 { using SafeMath for uint256; 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 recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, 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) { _approve(_msgSender(), spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue) ); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub( subtractedValue, "ERC20: decreased allowance below zero" ) ); return true; } function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub( amount, "ERC20: transfer amount exceeds balance" ); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, 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 = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(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); _balances[account] = _balances[account].sub( amount, "ERC20: burn amount exceeds balance" ); _totalSupply = _totalSupply.sub(amount); emit Transfer(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 _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } interface DividendPayingTokenOptionalInterface { function withdrawableDividendOf(address _owner) external view returns (uint256); function withdrawnDividendOf(address _owner) external view returns (uint256); function accumulativeDividendOf(address _owner) external view returns (uint256); } interface DividendPayingTokenInterface { function dividendOf(address _owner) external view returns (uint256); function distributeDividends() external payable; function withdrawDividend() external; event DividendsDistributed(address indexed from, uint256 weiAmount); event DividendWithdrawn(address indexed to, uint256 weiAmount); } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); return a / b; } function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } contract DividendPayingToken is ERC20, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; uint256 internal constant magnitude = 2**128; uint256 internal magnifiedDividendPerShare; mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; uint256 public totalDividendsDistributed; constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {} receive() external payable { distributeDividends(); } function distributeDividends() public payable override { require(totalSupply() > 0); if (msg.value > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (msg.value).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, msg.value); totalDividendsDistributed = totalDividendsDistributed.add( msg.value ); } } function withdrawDividend() public virtual override { _withdrawDividendOfUser(payable(msg.sender)); } function _withdrawDividendOfUser(address payable user) internal virtual returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add( _withdrawableDividend ); emit DividendWithdrawn(user, _withdrawableDividend); (bool success, ) = user.call{ value: _withdrawableDividend, gas: 3000 }(""); if (!success) { withdrawnDividends[user] = withdrawnDividends[user].sub( _withdrawableDividend ); return 0; } return _withdrawableDividend; } return 0; } function dividendOf(address _owner) public view override returns (uint256) { return withdrawableDividendOf(_owner); } function withdrawableDividendOf(address _owner) public view override returns (uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } function withdrawnDividendOf(address _owner) public view override returns (uint256) { return withdrawnDividends[_owner]; } function accumulativeDividendOf(address _owner) public view override returns (uint256) { return magnifiedDividendPerShare .mul(balanceOf(_owner)) .toInt256Safe() .add(magnifiedDividendCorrections[_owner]) .toUint256Safe() / magnitude; } function _transfer( address from, address to, uint256 value ) internal virtual override { require(false); int256 _magCorrection = magnifiedDividendPerShare .mul(value) .toInt256Safe(); magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from] .add(_magCorrection); magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub( _magCorrection ); } function _mint(address account, uint256 value) internal override { super._mint(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[ account ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe()); } function _burn(address account, uint256 value) internal override { super._burn(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[ account ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe()); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if (newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if (newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } } contract RuffRuff is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; bool private swapping; bool private stakingEnabled = false; bool public tradingEnabled = false; RuffRuffDividendTracker public dividendTracker; address public liquidityWallet; address payable public marketingAddress = payable(0xc00991c80F10df939E57B6fFa298fCa5737Ae706); address payable public marketingAddress2 = payable(0x027aBf2e14bc9Aa5126CF0dE7Aa687B474776383); uint256 public maxWalletSize = 20000000 * 10**9; // 2% Max uint256 public swapTokensAtAmount = 200000 * (10**9); uint256 public swapTokensAtAmountMax = 5000000 * (10**9); uint256 public devFees = 3; uint256 public devFeesReferred = 2; uint256 public liquidityFee = 1; uint256 public liquidityFeeReferred = 0; uint256 public BNBRewardsBuyFee = 0; uint256 public BNBRewardsBuyFeeReferred = 0; uint256 public BNBRewardsSellFee = 0; uint256 public BNBRewardsSellFeeReferred = 0; uint256 private countDevFees = 0; uint256 private countLiquidityFees = 0; uint256 private countBNBRewardsFee = 0; mapping(address => mapping(int256 => address)) public referrerTree; mapping(address => bool) private convertReferrals; mapping(address => uint256) private unconvertedTokens; uint256 public unconvertedTokensIndex; uint256 public unconvertedTokensIndexUpper; mapping(uint256 => address) private unconvertedTokensKeys; bool public enableConvertingReferralRewards; uint256 public referralFee; // referral fees are split up by the referralTreeFees mapping(int256 => uint256) public referralTreeFees; int256 private referralTreeFeesLength; mapping(address => uint256) public referralCount; mapping(address => uint256) public referralCountBranched; mapping(address => uint256) public referralEarnings; mapping(address => uint256) public referralEarningsConverted; mapping(address => uint256) public referralEarningsConvertedInPayout; uint256 public totalReferralsDistributed; uint256 public totalReferralsDistributedConverted; uint256 public totalReferralsDistributedConvertedInPayout; uint256 private iteration = 0; uint256 private iterationDaily = 0; uint256 private iterationWeekly = 0; uint256 private iterationMonthly = 0; uint256 public dailyTimer = block.timestamp + 86400; uint256 public weeklyTimer = block.timestamp + 604800; uint256 public monthlyTimer = block.timestamp + 2629743; bool public swapAndLiquifyEnabled = true; uint256 public gasForProcessing = 300000; mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) public automatedMarketMakerPairs; mapping(address => uint256) public stakingBonus; mapping(address => uint256) public stakingUntilDate; mapping(uint256 => uint256) public stakingAmounts; mapping(address => bool) private canTransferBeforeTradingIsEnabled; event EnableSwapAndLiquify(bool enabled); event UpdateDividendTracker( address indexed newAddress, address indexed oldAddress ); event UpdateUniswapV2Router( address indexed newAddress, address indexed oldAddress ); event UpdateFees( uint256 dev, uint256 liquidity, uint256 BNBRewardsBuy, uint256 BNBRewardsSell, uint256 referralFee ); event UpdateFeesReferred( uint256 dev, uint256 liquidity, uint256 BNBRewardsBuy, uint256 BNBRewardsSell ); event UpdateReferralTreeFees(int256 index, uint256 fee); event ExcludeFromFees(address indexed account, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event LiquidityWalletUpdated( address indexed newLiquidityWallet, address indexed oldLiquidityWallet ); event GasForProcessingUpdated( uint256 indexed newValue, uint256 indexed oldValue ); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity, bool success ); event SendDividends(uint256 dividends, uint256 marketing, bool success); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); event UpdatePayoutToken(address account, address token); event UpdateAllowTokens(address token, bool allow); event ReferralRewards( address from, address indexed to, uint256 indexed amount, uint256 iterationDaily, uint256 iterationWeekly, uint256 iterationMonthly, int256 treePosition, int256 indexed bnbAmount ); event ReferredBy( address indexed by, address indexed referree, uint256 iterationDaily, uint256 iterationWeekly, uint256 iterationMonthly ); event LeaderboardCompletion(uint8 leaderboardCase, uint256 iteration); constructor() ERC20("RuffRuff", "RUFF") { dividendTracker = new RuffRuffDividendTracker(payable(this)); liquidityWallet = owner(); uniswapV2Router = IUniswapV2Router02( // 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D //mainnet 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D //testnet ); // Create a uniswap pair for this new token uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair( address(this), uniswapV2Router.WETH() ); _setAutomatedMarketMakerPair(uniswapV2Pair, true); // exclude from receiving dividends dividendTracker.excludeFromDividends(address(dividendTracker)); dividendTracker.excludeFromDividends(address(this)); dividendTracker.excludeFromDividends( 0x000000000000000000000000000000000000dEaD ); dividendTracker.excludedFromDividends(address(0)); dividendTracker.excludeFromDividends(owner()); dividendTracker.excludeFromDividends(address(uniswapV2Router)); // exclude from paying fees or having max transaction amount _isExcludedFromFees[liquidityWallet] = true; _isExcludedFromFees[address(this)] = true; _isExcludedFromFees[owner()] = true; _isExcludedFromFees[address(dividendTracker)] = true; referralTreeFees[0] = 100; // 1% to primary referrer referralTreeFees[1] = 60; // 0.6% to secondary referrer referralTreeFees[2] = 40; // 0.4% to tertiary referrer referralTreeFeesLength = 3; calculateReferralFee(); canTransferBeforeTradingIsEnabled[owner()] = true; /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(owner(), 1000000000 * (10**9)); } function decimals() public view virtual override returns (uint8) { return 9; } receive() external payable {} function updateStakingAmounts(uint256 duration, uint256 bonus) public onlyOwner { require(stakingAmounts[duration] != bonus); require(bonus <= 100, "Staking bonus can't exceed 100"); require(bonus > 0, "Staking bonus can't be 0"); stakingAmounts[duration] = bonus; } function setMaxWalletSize(uint256 newMaxWalletSize) public onlyOwner { maxWalletSize = newMaxWalletSize; } function enableTrading() external onlyOwner { require(!tradingEnabled, "trading already enabled"); tradingEnabled = true; enableConvertingReferralRewards = true; blockNumEnabled = block.number; } function setPresaleWallet(address wallet) external onlyOwner { canTransferBeforeTradingIsEnabled[wallet] = true; _isExcludedFromFees[wallet] = true; dividendTracker.excludeFromDividends(wallet); } function updateDividendTracker(address newAddress) public onlyOwner { require(newAddress != address(dividendTracker)); RuffRuffDividendTracker newDividendTracker = RuffRuffDividendTracker( payable(newAddress) ); require(newDividendTracker.owner() == address(this)); newDividendTracker.excludeFromDividends(address(newDividendTracker)); newDividendTracker.excludeFromDividends(address(this)); newDividendTracker.excludeFromDividends(owner()); newDividendTracker.excludeFromDividends(address(uniswapV2Router)); emit UpdateDividendTracker(newAddress, address(dividendTracker)); dividendTracker = newDividendTracker; } function setMarketingAddress(address payable newAddress) public onlyOwner { marketingAddress = newAddress; } function setMarketingAddress2(address payable newAddress2) public onlyOwner { marketingAddress2 = newAddress2; } function updateUniswapV2Router(address newAddress) public onlyOwner { require(newAddress != address(uniswapV2Router)); emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router)); uniswapV2Router = IUniswapV2Router02(newAddress); dividendTracker.updateUniswapV2Router(newAddress); } function excludeFromFees(address account, bool excluded) public onlyOwner { require(_isExcludedFromFees[account] != excluded); _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function enableSwapAndLiquify(bool enabled) public onlyOwner { require(swapAndLiquifyEnabled != enabled); swapAndLiquifyEnabled = enabled; emit EnableSwapAndLiquify(enabled); } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require(pair != uniswapV2Pair); _setAutomatedMarketMakerPair(pair, value); } function setAllowCustomTokens(bool allow) public onlyOwner { dividendTracker.setAllowCustomTokens(allow); } function setAllowAutoReinvest(bool allow) public onlyOwner { dividendTracker.setAllowAutoReinvest(allow); } function _setAutomatedMarketMakerPair(address pair, bool value) private { automatedMarketMakerPairs[pair] = value; if (value) { dividendTracker.excludeFromDividends(pair); } emit SetAutomatedMarketMakerPair(pair, value); } function updateLiquidityWallet(address newLiquidityWallet) public onlyOwner { excludeFromFees(newLiquidityWallet, true); emit LiquidityWalletUpdated(newLiquidityWallet, liquidityWallet); liquidityWallet = newLiquidityWallet; } function updateGasForProcessing(uint256 newValue) public onlyOwner { require( newValue >= 200000 && newValue <= 500000, "new gas value must be between 200000 and 500000" ); gasForProcessing = newValue; } function updateFees( uint256 dev, uint256 liquidity, uint256 BNBRewardsBuy, uint256 BNBRewardsSell, uint256 referral ) public onlyOwner { devFees = dev; liquidityFee = liquidity; BNBRewardsBuyFee = BNBRewardsBuy; BNBRewardsSellFee = BNBRewardsSell; referralFee = referral; emit UpdateFees( dev, liquidity, BNBRewardsBuy, BNBRewardsSell, referralFee ); } function updateFeesReferred( uint256 devReferred, uint256 liquidityReferred, uint256 BNBRewardsBuyReferred, uint256 BNBRewardsSellReferred ) public onlyOwner { require(BNBRewardsBuyReferred <= 2, "Cannot set BNBreward fee over 2%"); require( BNBRewardsSellReferred <= 2, "Cannot set BNBreward fee over 2%" ); require(devReferred <= 10, "Cannot set dev fee over 10%"); require(liquidityReferred <= 10, "Cannot set liquidity fee over 10%"); devFeesReferred = devReferred; liquidityFeeReferred = liquidityReferred; BNBRewardsBuyFeeReferred = BNBRewardsBuyReferred; BNBRewardsSellFeeReferred = BNBRewardsSellReferred; emit UpdateFeesReferred( devReferred, liquidityReferred, BNBRewardsBuyReferred, BNBRewardsSellReferred ); } // returns with two decimals of precision. i.e. "123" == "1.23%" function getReferralTreeFees(int256 index) public view returns (uint256) { return referralTreeFees[index]; } function getReferralTreeFeesLength() public view returns (int256) { return referralTreeFeesLength; } function calculateReferralFee() private { uint256 referralTreeFeesAdded; for (int256 i = 0; i < referralTreeFeesLength; i++) { referralTreeFeesAdded += referralTreeFees[i]; } referralFee = referralTreeFeesAdded / 100; } function setReferralTreeFeesLength(int256 length) public onlyOwner { referralTreeFeesLength = length; calculateReferralFee(); } function updateReferralTreeFees(int256 index, uint256 fee) public onlyOwner { referralTreeFees[index] = fee; calculateReferralFee(); emit UpdateReferralTreeFees(index, fee); } function getTotalDividendsDistributed() external view returns (uint256) { return dividendTracker.totalDividendsDistributed(); } function isExcludedFromFees(address account) public view returns (bool) { return _isExcludedFromFees[account]; } function withdrawableDividendOf(address account) public view returns (uint256) { return dividendTracker.withdrawableDividendOf(account); } function dividendTokenBalanceOf(address account) public view returns (uint256) { return dividendTracker.balanceOf(account); } function getAccountDividendsInfo(address account) external view returns ( address, int256, int256, uint256, uint256, uint256 ) { return dividendTracker.getAccount(account); } function getAccountDividendsInfoAtIndex(uint256 index) external view returns ( address, int256, int256, uint256, uint256, uint256 ) { return dividendTracker.getAccountAtIndex(index); } function processDividendTracker(uint256 gas) external { ( uint256 iterations, uint256 claims, uint256 lastProcessedIndex ) = dividendTracker.process(gas); emit ProcessedDividendTracker( iterations, claims, lastProcessedIndex, false, gas, tx.origin ); } function claim() external { dividendTracker.processAccount(payable(msg.sender), false); } function getLastProcessedIndex() external view returns (uint256) { return dividendTracker.getLastProcessedIndex(); } function getNumberOfDividendTokenHolders() external view returns (uint256) { return dividendTracker.getNumberOfTokenHolders(); } function setAutoClaim(bool value) external { dividendTracker.setAutoClaim(msg.sender, value); } function setReinvest(bool value) external { dividendTracker.setReinvest(msg.sender, value); } function setDividendsPaused(bool value) external onlyOwner { dividendTracker.setDividendsPaused(value); } function isExcludedFromAutoClaim(address account) external view returns (bool) { return dividendTracker.isExcludedFromAutoClaim(account); } function isReinvest(address account) external view returns (bool) { return dividendTracker.isReinvest(account); } function getETHBalance() external view returns (uint256) { return address(this).balance; } function transferETH(address destination, uint256 bnb) external onlyOwner { payable(destination).transfer(bnb); } function getNativeBalance() external view returns (uint256) { return balanceOf(address(this)); } function getCountOfFeesToSwap() external view returns ( uint256, uint256, uint256 ) { return (countBNBRewardsFee, countDevFees, countLiquidityFees); } function transferERC20Token( address tokenAddress, uint256 amount, address destination ) external onlyOwner { require(tokenAddress != address(this), "Cannot remove native token"); ERC20(tokenAddress).transfer(destination, amount); } uint256 private originalAmountBeforeFees; uint256 private devFeeActual; uint256 private liquidityFeeActual; uint256 private BNBRewardsBuyFeeActual; uint256 private BNBRewardsSellFeeActual; uint256 private totalBuyFeesActual; uint256 private totalSellFeesActual; uint256 private blockNumEnabled; uint256 private earlyBlocks; uint256 private earlyTax; function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require( tradingEnabled || canTransferBeforeTradingIsEnabled[from], "Trading has not yet been enabled" ); if (from != uniswapV2Pair) { require( to != address(this), "You cannot send tokens to the contract address!" ); } if (amount == 0) { super._transfer(from, to, 0); return; } else if ( !swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] && (to == address(uniswapV2Pair) || from == address(uniswapV2Pair)) ) { bool isSelling = automatedMarketMakerPairs[to]; devFeeActual = devFees; liquidityFeeActual = liquidityFee; BNBRewardsBuyFeeActual = BNBRewardsBuyFee; BNBRewardsSellFeeActual = BNBRewardsSellFee; bool isReferredOnBuy = false; address referrer = address( 0x0000000000000000000000000000000000000000 ); // if the user has been referred by someone and is buying, change to special fees if ((getReferrerOf(to) != referrer) && !isSelling) { isReferredOnBuy = true; referrer = getReferrerOf(to); devFees = devFeesReferred; liquidityFee = liquidityFeeReferred; BNBRewardsBuyFee = BNBRewardsBuyFeeReferred; BNBRewardsSellFee = BNBRewardsSellFeeReferred; } if (block.number < blockNumEnabled + earlyBlocks) { devFees = earlyTax; liquidityFee = 0; BNBRewardsBuyFee = 0; BNBRewardsSellFee = 0; } if(to != uniswapV2Pair) { require(ERC20.balanceOf(to) + amount < maxWalletSize, "TOKEN: Balance exceeds wallet size!"); } uint256 contractTokenBalance = balanceOf(address(this)); // convert referral rewards into payout token if ( unconvertedTokensIndexUpper > 0 && enableConvertingReferralRewards && isSelling ) { uint256 toConvert = getUnconvertedReferralRewards( unconvertedTokensKeys[unconvertedTokensIndex] ); if (toConvert <= 0) { unconvertedTokensIndex++; } else { if (toConvert > swapTokensAtAmountMax) { toConvert = swapTokensAtAmountMax; } swapTokensForPayoutToken( from, toConvert, payable(unconvertedTokensKeys[unconvertedTokensIndex]) ); } } bool canSwap = contractTokenBalance >= swapTokensAtAmount; if (canSwap && !automatedMarketMakerPairs[from]) { swapping = true; if (swapAndLiquifyEnabled) { swapAndLiquify(countLiquidityFees); } swapAndSendDividendsAndMarketingFunds( countBNBRewardsFee, countDevFees ); swapping = false; } originalAmountBeforeFees = amount; /* Referral System */ uint256 referralFeeTxn = amount.mul(referralFee).div(100); if (isReferredOnBuy) { for (int256 i = 0; i < referralTreeFeesLength; i++) { address treePayoutTo = referrerTree[to][i]; uint256 adjustedTax = originalAmountBeforeFees .mul(referralTreeFees[i]) .div(10000); if ( treePayoutTo == address(0x0000000000000000000000000000000000000000) ) { break; } amount = amount.sub(adjustedTax); if ( !getConvertReferralRewards(treePayoutTo) || !enableConvertingReferralRewards ) { super._transfer(from, treePayoutTo, adjustedTax); dividendTracker.setBalance( treePayoutTo, getStakingBalance(treePayoutTo) ); referralEarnings[treePayoutTo] += adjustedTax; totalReferralsDistributed += adjustedTax; referralFeeTxn -= adjustedTax; emit ReferralRewards( from, treePayoutTo, adjustedTax, iterationDaily, iterationWeekly, iterationMonthly, i, -1 ); } else { super._transfer(from, address(this), adjustedTax); if (getUnconvertedReferralRewards(treePayoutTo) <= 0) { unconvertedTokensKeys[ unconvertedTokensIndexUpper ] = treePayoutTo; unconvertedTokensIndexUpper++; } unconvertedTokens[treePayoutTo] += adjustedTax; referralFeeTxn -= adjustedTax; } } if (referralFeeTxn > 0) { amount = amount.sub(referralFeeTxn); super._transfer(from, address(this), referralFeeTxn); countBNBRewardsFee += referralFeeTxn; } } else if (!isSelling) { // if not referred on buy, use the referral tax towards passive earn rewards amount = amount.sub(referralFeeTxn); super._transfer(from, address(this), referralFeeTxn); countBNBRewardsFee += referralFeeTxn; } /* */ uint256 BNBRewardsFee = isSelling ? BNBRewardsSellFee : BNBRewardsBuyFee; uint256 devFeeAmount = originalAmountBeforeFees.mul(devFees).div( 100 ); uint256 liquidityFeeAmount = originalAmountBeforeFees .mul(liquidityFee) .div(100); uint256 BNBRewardsFeeAmount = originalAmountBeforeFees .mul(BNBRewardsFee) .div(100); countDevFees += devFeeAmount; countLiquidityFees += liquidityFeeAmount; countBNBRewardsFee += BNBRewardsFeeAmount; uint256 fees = devFeeAmount + liquidityFeeAmount + BNBRewardsFeeAmount; amount = amount.sub(fees); super._transfer(from, address(this), fees); uint256 gas = gasForProcessing; try dividendTracker.process(gas) returns ( uint256 iterations, uint256 claims, uint256 lastProcessedIndex ) { emit ProcessedDividendTracker( iterations, claims, lastProcessedIndex, true, gas, tx.origin ); } catch {} // set fees back to normal values if (isReferredOnBuy) { devFees = devFeeActual; liquidityFee = liquidityFeeActual; BNBRewardsBuyFee = BNBRewardsBuyFeeActual; BNBRewardsSellFee = BNBRewardsSellFeeActual; } } super._transfer(from, to, amount); dividendTracker.setBalance(from, getStakingBalance(from)); dividendTracker.setBalance(to, getStakingBalance(to)); updateReferralLeaderboards(); } function getStakingBalance(address account) private view returns (uint256) { return stakingEnabled ? balanceOf(account).mul(stakingBonus[account].add(100)).div( 100 ) : balanceOf(account); } function swapAndLiquify(uint256 tokens) private { if (tokens > balanceOf(address(this))) { emit SwapAndLiquify(0, 0, 0, false); return; } // avoid price impact errors with large transactions if (tokens > swapTokensAtAmountMax) { tokens = swapTokensAtAmountMax; } // split the contract balance into halves uint256 half = tokens.div(2); uint256 otherHalf = tokens.sub(half); if (half <= 0 || otherHalf <= 0) { return; } // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForEth(half, payable(address(this))); countLiquidityFees -= half; // how much ETH did we just swap into? uint256 newBalance = address(this).balance.sub(initialBalance); // add liquidity to uniswap addLiquidity(otherHalf, newBalance); countLiquidityFees -= otherHalf; emit SwapAndLiquify(half, newBalance, otherHalf, true); } function setSwapTokensAmount(uint256 amount) public onlyOwner { require(amount <= 20000000, "cannot set swap amount greater than .2%"); swapTokensAtAmount = amount; } function setSwapTokensAmountMax(uint256 amount) public onlyOwner { require( amount > swapTokensAtAmount, "Max amount must be greater than minimum" ); require(amount <= 20000000, "cannot set swap amount greater than .2%"); swapTokensAtAmountMax = amount; } function swapTokensForEth(uint256 tokenAmount, address payable account) private { if (tokenAmount <= 0) { return; } if (balanceOf(address(this)) < tokenAmount) { tokenAmount = balanceOf(address(this)); } // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, account, block.timestamp ); } address private upcoming = address(0); uint256 private upcomingAmount = 0; address private upcomingFrom = address(0); function clearUnconvertedEntry() private { unconvertedTokens[unconvertedTokensKeys[unconvertedTokensIndex]] = 0; unconvertedTokensKeys[unconvertedTokensIndex] = address(0); unconvertedTokensIndex++; if (unconvertedTokensIndex >= unconvertedTokensIndexUpper) { unconvertedTokensIndex = 0; unconvertedTokensIndexUpper = 0; } } function swapTokensForPayoutToken( address fromOriginal, uint256 tokenAmount, address payable account ) private { if (tokenAmount <= 0) { return; } uint256 initialBalance; uint256 newBalance; if (dividendTracker.getPayoutToken(account) == address(0)) { initialBalance = address(this).balance; swapTokensForEth(tokenAmount, account); newBalance = address(this).balance.sub(initialBalance); referralEarningsConverted[account] += tokenAmount; totalReferralsDistributedConverted += tokenAmount; referralEarningsConvertedInPayout[account] += newBalance; totalReferralsDistributedConvertedInPayout += newBalance; emit ReferralRewards( fromOriginal, account, unconvertedTokens[account], iterationDaily, iterationWeekly, iterationMonthly, int256(-1), int256(newBalance) ); clearUnconvertedEntry(); if (upcoming == address(0)) { return; } } else if (upcoming == address(0)) { initialBalance = address(this).balance; swapTokensForEth(tokenAmount, payable(address(this))); newBalance = address(this).balance.sub(initialBalance); referralEarningsConverted[account] += tokenAmount; totalReferralsDistributedConverted += tokenAmount; upcoming = account; upcomingAmount = newBalance; upcomingFrom = fromOriginal; clearUnconvertedEntry(); return; } address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = dividendTracker.getPayoutToken(upcoming); try uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{ value: upcomingAmount }(0, path, upcoming, block.timestamp) {} catch {} referralEarningsConvertedInPayout[upcoming] += upcomingAmount; totalReferralsDistributedConvertedInPayout += upcomingAmount; emit ReferralRewards( upcomingFrom, upcoming, upcomingAmount, iterationDaily, iterationWeekly, iterationMonthly, int256(-1), int256(upcomingAmount) ); if (dividendTracker.getPayoutToken(account) != address(0)) { upcoming = account; upcomingAmount = newBalance; upcomingFrom = fromOriginal; } else { upcoming = address(0); upcomingAmount = 0; upcomingFrom = address(0); } clearUnconvertedEntry(); } function getUnconvertedReferralRewardsIndexAt(uint256 index) public view returns ( address, uint256, uint256 ) { return ( unconvertedTokensKeys[index], unconvertedTokensIndexUpper, unconvertedTokens[unconvertedTokensKeys[index]] ); } function updatePayoutToken(address token) public { require( balanceOf(msg.sender) > 0, "You must own more than zero $RUFF tokens to switch your payout token!" ); require(token != address(this)); dividendTracker.updatePayoutToken(msg.sender, token); emit UpdatePayoutToken(msg.sender, token); } function getPayoutToken(address account) public view returns (address) { return dividendTracker.getPayoutToken(account); } function updateAllowTokens(address token, bool allow) public onlyOwner { require(token != address(this), "Cannot use native token address"); dividendTracker.updateAllowTokens(token, allow); emit UpdateAllowTokens(token, allow); } function getAllowTokens(address token) public view returns (bool) { return dividendTracker.getAllowTokens(token); } function setReferrer(address _referrer) public { require(_referrer != address(0), "Not a valid referrer"); require(_referrer != msg.sender, "You cannot refer yourself"); require( referrerTree[msg.sender][0] == address(0), "Referrer cannot be changed!" ); // add the direct referrer to the user's payout tree referrerTree[msg.sender][0] = _referrer; referralCount[_referrer] = referralCount[_referrer] + 1; // check if the referrer was referred through a tree of their own; // set payout tree accordingly if so for (int256 i = 0; i < referralTreeFeesLength - 1; i++) { address treeAddress = referrerTree[_referrer][i]; if ( treeAddress == address(0x0000000000000000000000000000000000000000) ) { break; } referrerTree[msg.sender][i + 1] = treeAddress; referralCountBranched[treeAddress] = referralCountBranched[treeAddress] + 1; } emit ReferredBy( _referrer, msg.sender, iterationDaily, iterationWeekly, iterationMonthly ); } function getReferrer() public view returns (address) { return referrerTree[msg.sender][0]; } function getReferrerOf(address account) public view returns (address) { return referrerTree[account][0]; } function getReferralCount(address account) public view returns (uint256) { return referralCount[account]; } function getReferralCountBranched(address account) public view returns (uint256) { return referralCountBranched[account]; } function getReferralEarnings(address account) public view returns (uint256) { return referralEarnings[account]; } function getReferralTree(address account, int256 index) public view returns (address) { return referrerTree[account][index]; } function setReferralTreeAtIndex( address account, int256 index, address accountToInsert ) public onlyOwner { referrerTree[account][index] = accountToInsert; } function getReferralTreeLength(address account) public view returns (int256) { for (int256 i = 0; i < referralTreeFeesLength; i++) { if ( referrerTree[account][i] == address(0x0000000000000000000000000000000000000000) ) { return i; } } return -1; } function getConvertReferralRewards(address account) public view returns (bool) { return convertReferrals[account]; } function getUnconvertedReferralRewards(address account) public view returns (uint256) { return unconvertedTokens[account]; } function convertReferralRewards(bool convert) public { require( enableConvertingReferralRewards, "Converting referral rewards is not enabled yet!" ); convertReferrals[msg.sender] = convert; } function updateReferralLeaderboards() private { // check if the daily/weekly/monthly leaderboards should be reset if (block.timestamp >= dailyTimer) { iterationDaily++; dailyTimer = block.timestamp + 8600; emit LeaderboardCompletion(1, iterationDaily - 1); } if (block.timestamp >= weeklyTimer) { iterationWeekly++; weeklyTimer = block.timestamp + 604800; emit LeaderboardCompletion(2, iterationWeekly - 1); } if (block.timestamp >= monthlyTimer) { iterationMonthly++; monthlyTimer = block.timestamp + 2629743; emit LeaderboardCompletion(3, iterationMonthly - 1); } } function getReferralLeaderboardTimers() public view returns ( uint256, uint256, uint256 ) { return (dailyTimer, weeklyTimer, monthlyTimer); } function setReferralLeaderboardTimers( uint256 daily, uint256 weekly, uint256 monthly ) public onlyOwner { dailyTimer = daily; weeklyTimer = weekly; monthlyTimer = monthly; } function forceUpdateReferralLeaderboards() public onlyOwner returns ( uint256, uint256, uint256 ) { updateReferralLeaderboards(); return getReferralLeaderboardTimers(); } function getIterations() public view returns ( uint256, uint256, uint256, uint256 ) { return (iteration, iterationDaily, iterationWeekly, iterationMonthly); } function setIterations( uint256 newIteration, uint256 newIterationDaily, uint256 newIterationWeekly, uint256 newIterationMonthly ) public onlyOwner { iteration = newIteration; iterationDaily = newIterationDaily; iterationWeekly = newIterationWeekly; iterationMonthly = newIterationMonthly; } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable liquidityWallet, block.timestamp ); } function forceSwapAndSendDividendsAndMarketingFundsAndLiquidity( uint256 dividends, uint256 marketing, uint256 liquidity ) public onlyOwner { swapAndLiquify(liquidity); swapAndSendDividendsAndMarketingFunds(dividends, marketing); } function swapAndSendDividendsAndMarketingFunds( uint256 dividends, uint256 marketing ) private { if (dividends + marketing > balanceOf(address(this))) { emit SendDividends(dividends, marketing, false); return; } uint256 beforeSwap; uint256 afterSwapDelta; if (dividends > swapTokensAtAmountMax) { dividends = swapTokensAtAmountMax; } beforeSwap = address(this).balance; swapTokensForEth(dividends, payable(address(this))); afterSwapDelta = address(this).balance - beforeSwap; countBNBRewardsFee -= dividends; uint256 BNBRewardsFeeBNB = afterSwapDelta; if (dividends <= 0) { BNBRewardsFeeBNB = 0; } (bool success, ) = address(dividendTracker).call{ value: BNBRewardsFeeBNB }(""); if (marketing > swapTokensAtAmountMax) { marketing = swapTokensAtAmountMax; } beforeSwap = address(this).balance; swapTokensForEth(marketing, payable(address(this))); afterSwapDelta = address(this).balance - beforeSwap; countDevFees -= marketing; uint256 devFeesBNB = afterSwapDelta; if (marketing <= 0) { devFeesBNB = 0; } // Calculate the amount to send to each wallet uint256 splitValue = devFeesBNB / 2; // Send to first wallet (bool successWallet1, ) = address(marketingAddress).call{ value: splitValue }(""); require(successWallet1, "Sending BNB to wallet 1 failed"); // Send to second wallet (bool successWallet2, ) = address(marketingAddress2).call{ value: splitValue }(""); require(successWallet2, "Sending BNB to wallet 2 failed"); // Check if both transfers were successful bool successMarketing = successWallet1 && successWallet2; emit SendDividends( BNBRewardsFeeBNB, devFeesBNB, success && successMarketing ); } function setearlyBlocks(uint256 amount) public onlyOwner { require(!tradingEnabled); earlyBlocks = amount; } function setearlyTax(uint256 amount) public onlyOwner { require(!tradingEnabled); earlyTax = amount; } } contract RuffRuffDividendTracker is DividendPayingToken, Ownable { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping(address => bool) public excludedFromDividends; mapping(address => bool) public excludedFromAutoClaim; mapping(address => bool) public autoReinvest; mapping(address => address) public payoutToken; mapping(address => bool) public allowTokens; bool public allowCustomTokens; bool public allowAutoReinvest; bool public dividendsPaused = false; IUniswapV2Router02 public uniswapV2Router; RuffRuff public ruffruff; mapping(address => uint256) public lastClaimTimes; uint256 public immutable minimumTokenBalanceForAutoDividends; uint256 public immutable minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event DividendReinvested( address indexed acount, uint256 value, bool indexed automatic ); event Claim( address indexed account, uint256 amount, bool indexed automatic ); event DividendsPaused(bool paused); event SetAllowCustomTokens(bool allow); event SetAllowAutoReinvest(bool allow); constructor(address payable mainContract) DividendPayingToken( "RuffRuff_Dividend_Tracker", "RuffRuff_Dividend_Tracker" ) { ruffruff = RuffRuff(mainContract); minimumTokenBalanceForAutoDividends = 1 * (10**9); minimumTokenBalanceForDividends = 1 * (10**9); uniswapV2Router = IUniswapV2Router02( //0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D MAINNET 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D //TESTNET ); allowCustomTokens = true; allowAutoReinvest = true; } function decimals() public view virtual override returns (uint8) { return 9; } function _transfer( address, address, uint256 ) internal pure override { require(false, "RuffRuff_Dividend_Tracker: No transfers allowed"); } function withdrawDividend() public pure override { require( false, "RuffRuff_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main RuffRuff contract." ); } function isExcludedFromAutoClaim(address account) external view onlyOwner returns (bool) { return excludedFromAutoClaim[account]; } function isReinvest(address account) external view onlyOwner returns (bool) { return autoReinvest[account]; } function getAllowCustomTokens() public view returns (bool) { return (allowCustomTokens); } function setAllowCustomTokens(bool allow) external onlyOwner { require(allowCustomTokens != allow); allowCustomTokens = allow; emit SetAllowCustomTokens(allow); } function setAllowAutoReinvest(bool allow) external onlyOwner { require(allowAutoReinvest != allow); allowAutoReinvest = allow; emit SetAllowAutoReinvest(allow); } function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account]); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function setAutoClaim(address account, bool value) external onlyOwner { excludedFromAutoClaim[account] = value; } function setReinvest(address account, bool value) external onlyOwner { autoReinvest[account] = value; } function setDividendsPaused(bool value) external onlyOwner { require(dividendsPaused != value); dividendsPaused = value; emit DividendsPaused(value); } function getLastProcessedIndex() external view returns (uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns (uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime ) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if (index >= 0) { if (uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub( int256(lastProcessedIndex) ); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add( int256(processesUntilEndOfArray) ); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, int256, uint256, uint256, uint256 ) { if (index >= tokenHoldersMap.size()) { return ( 0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0 ); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function setBalance(address account, uint256 newBalance) external onlyOwner { if (excludedFromDividends[account]) { return; } if (newBalance < minimumTokenBalanceForDividends) { tokenHoldersMap.remove(account); _setBalance(account, 0); return; } _setBalance(account, newBalance); if (newBalance >= minimumTokenBalanceForAutoDividends) { tokenHoldersMap.set(account, newBalance); } else { tokenHoldersMap.remove(account); } } function process(uint256 gas) public returns ( uint256, uint256, uint256 ) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if (numberOfTokenHolders == 0 || dividendsPaused) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while (gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if (_lastProcessedIndex >= numberOfTokenHolders) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if (!excludedFromAutoClaim[account]) { if (processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if (gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { if (dividendsPaused) { return false; } bool reinvest = autoReinvest[account]; if (automatic && reinvest && !allowAutoReinvest) { return false; } uint256 amount = reinvest ? _reinvestDividendOfUser(account) : _withdrawDividendOfUser(account); if (amount > 0) { lastClaimTimes[account] = block.timestamp; if (reinvest) { emit DividendReinvested(account, amount, automatic); } else { emit Claim(account, amount, automatic); } return true; } return false; } function updateUniswapV2Router(address newAddress) public onlyOwner { uniswapV2Router = IUniswapV2Router02(newAddress); } function updatePayoutToken(address account, address token) public onlyOwner { require( allowTokens[token] || token == address(0), "Token not in allow list" ); payoutToken[account] = token; } function getPayoutToken(address account) public view returns (address) { return payoutToken[account]; } function updateAllowTokens(address token, bool allow) public onlyOwner { allowTokens[token] = allow; } function getAllowTokens(address token) public view returns (bool) { return allowTokens[token]; } function _reinvestDividendOfUser(address account) private returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(account); if (_withdrawableDividend > 0) { bool success; withdrawnDividends[account] = withdrawnDividends[account].add( _withdrawableDividend ); address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(ruffruff); uint256 prevBalance = ruffruff.balanceOf(address(this)); // make the swap try uniswapV2Router .swapExactETHForTokensSupportingFeeOnTransferTokens{ value: _withdrawableDividend }( 0, // accept any amount of Tokens path, address(this), block.timestamp ) { uint256 received = ruffruff.balanceOf(address(this)).sub( prevBalance ); if (received > 0) { success = true; ruffruff.transfer(account, received); } else { success = false; } } catch { success = false; } if (!success) { withdrawnDividends[account] = withdrawnDividends[account].sub( _withdrawableDividend ); return 0; } return _withdrawableDividend; } return 0; } function _withdrawDividendOfUser(address payable user) internal override returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add( _withdrawableDividend ); address tokenAddress = payoutToken[user]; bool success; // if no tokenAddress assume bnb payout if ( !allowCustomTokens || tokenAddress == address(0) || !allowTokens[tokenAddress] ) { (success, ) = user.call{ value: _withdrawableDividend, gas: 3000 }(""); } else { //investor wants to be payed out in a custom token address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = tokenAddress; try uniswapV2Router .swapExactETHForTokensSupportingFeeOnTransferTokens{ value: _withdrawableDividend }( 0, // accept any amount of Tokens path, user, block.timestamp ) { success = true; } catch { success = false; } } if (!success) { withdrawnDividends[user] = withdrawnDividends[user].sub( _withdrawableDividend ); return 0; } else { emit DividendWithdrawn(user, _withdrawableDividend); } return _withdrawableDividend; } return 0; } }
{ "optimizer": { "enabled": true, "runs": 5 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","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":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableSwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"leaderboardCase","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"iteration","type":"uint256"}],"name":"LeaderboardCompletion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","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":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"iterationDaily","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"iterationWeekly","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"iterationMonthly","type":"uint256"},{"indexed":false,"internalType":"int256","name":"treePosition","type":"int256"},{"indexed":true,"internalType":"int256","name":"bnbAmount","type":"int256"}],"name":"ReferralRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"referree","type":"address"},{"indexed":false,"internalType":"uint256","name":"iterationDaily","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"iterationWeekly","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"iterationMonthly","type":"uint256"}],"name":"ReferredBy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"dividends","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"marketing","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SwapAndLiquify","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"allow","type":"bool"}],"name":"UpdateAllowTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"dev","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"BNBRewardsBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"BNBRewardsSell","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referralFee","type":"uint256"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"dev","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"BNBRewardsBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"BNBRewardsSell","type":"uint256"}],"name":"UpdateFeesReferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"UpdatePayoutToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"int256","name":"index","type":"int256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"UpdateReferralTreeFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"BNBRewardsBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BNBRewardsBuyFeeReferred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BNBRewardsSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BNBRewardsSellFeeReferred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":[{"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":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"convert","type":"bool"}],"name":"convertReferralRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dailyTimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"devFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeesReferred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract RuffRuffDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableConvertingReferralRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"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":[{"internalType":"uint256","name":"dividends","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"forceSwapAndSendDividendsAndMarketingFundsAndLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceUpdateReferralLeaderboards","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getAllowTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getConvertReferralRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCountOfFeesToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getETHBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIterations","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNativeBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getPayoutToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferralCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferralCountBranched","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferralEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferralLeaderboardTimers","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"}],"name":"getReferralTree","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"index","type":"int256"}],"name":"getReferralTreeFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferralTreeFeesLength","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferralTreeLength","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferrer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getReferrerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUnconvertedReferralRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getUnconvertedReferralRewardsIndexAt","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"isExcludedFromAutoClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"account","type":"address"}],"name":"isReinvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeReferred","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAddress2","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monthlyTimer","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":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralCountBranched","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralEarningsConverted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralEarningsConvertedInPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int256","name":"","type":"int256"}],"name":"referralTreeFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"}],"name":"referrerTree","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowAutoReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowCustomTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutoClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setDividendsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newIteration","type":"uint256"},{"internalType":"uint256","name":"newIterationDaily","type":"uint256"},{"internalType":"uint256","name":"newIterationWeekly","type":"uint256"},{"internalType":"uint256","name":"newIterationMonthly","type":"uint256"}],"name":"setIterations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"setMarketingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress2","type":"address"}],"name":"setMarketingAddress2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxWalletSize","type":"uint256"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"daily","type":"uint256"},{"internalType":"uint256","name":"weekly","type":"uint256"},{"internalType":"uint256","name":"monthly","type":"uint256"}],"name":"setReferralLeaderboardTimers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"index","type":"int256"},{"internalType":"address","name":"accountToInsert","type":"address"}],"name":"setReferralTreeAtIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"length","type":"int256"}],"name":"setReferralTreeFeesLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"setReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAmountMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setearlyBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setearlyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingUntilDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmountMax","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":"totalReferralsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReferralsDistributedConverted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReferralsDistributedConvertedInPayout","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"transferERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"bnb","type":"uint256"}],"name":"transferETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":[],"name":"unconvertedTokensIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unconvertedTokensIndexUpper","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"allow","type":"bool"}],"name":"updateAllowTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"dev","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"BNBRewardsBuy","type":"uint256"},{"internalType":"uint256","name":"BNBRewardsSell","type":"uint256"},{"internalType":"uint256","name":"referral","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"devReferred","type":"uint256"},{"internalType":"uint256","name":"liquidityReferred","type":"uint256"},{"internalType":"uint256","name":"BNBRewardsBuyReferred","type":"uint256"},{"internalType":"uint256","name":"BNBRewardsSellReferred","type":"uint256"}],"name":"updateFeesReferred","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"}],"name":"updateLiquidityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"updatePayoutToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256","name":"index","type":"int256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"updateReferralTreeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"updateStakingAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weeklyTimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526007805461ffff60a81b19169055600a80546001600160a01b031990811673c00991c80f10df939e57b6ffa298fca5737ae70617909155600b805490911673027abf2e14bc9aa5126cf0de7aa687b47477638317905566470de4df820000600c5565b5e620f48000600d556611c37937e08000600e556003600f5560026010556001601155600060128190556013819055601481905560158190556016819055601781905560188190556019819055602c819055602d819055602e819055602f55620000d4426201518062000aee565b603055620000e64262093a8062000aee565b603155620000f8426228206f62000aee565b6032556033805460ff19166001179055620493e0603455604580546001600160a01b031990811690915560006046556047805490911690553480156200013d57600080fd5b5060405180604001604052806008815260200167293ab333293ab33360c11b81525060405180604001604052806004815260200163292aa32360e11b81525081600390816200018d919062000ba8565b5060046200019c828262000ba8565b5050506000620001b16200082060201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350306040516200020e9062000aca565b6200021a919062000c74565b604051809103906000f08015801562000237573d6000803e3d6000fd5b50600880546001600160a01b0319166001600160a01b03929092169190911790556200026262000824565b600980546001600160a01b03929092166001600160a01b031992831617905560068054909116737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620002df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000305919062000c88565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000368573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200038e919062000c88565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620003dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000402919062000c88565b600780546001600160a01b0319166001600160a01b039290921691821790556200042e90600162000833565b60085460405163031e79db60e41b81526001600160a01b03909116906331e79db0906200046090839060040162000c74565b600060405180830381600087803b1580156200047b57600080fd5b505af115801562000490573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b0390911692506331e79db09150620004c690309060040162000c74565b600060405180830381600087803b158015620004e157600080fd5b505af1158015620004f6573d6000803e3d6000fd5b505060085460405163031e79db60e41b81526001600160a01b0390911692506331e79db091506200052e9061dead9060040162000c74565b600060405180830381600087803b1580156200054957600080fd5b505af11580156200055e573d6000803e3d6000fd5b5050600854604051634e7b827f60e01b81526001600160a01b039091169250634e7b827f9150620005959060009060040162000c74565b602060405180830381865afa158015620005b3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005d9919062000cb3565b506008546001600160a01b03166331e79db0620005f562000824565b6040518263ffffffff1660e01b815260040162000613919062000c74565b600060405180830381600087803b1580156200062e57600080fd5b505af115801562000643573d6000803e3d6000fd5b505060085460065460405163031e79db60e41b81526001600160a01b0392831694506331e79db093506200067e929091169060040162000c74565b600060405180830381600087803b1580156200069957600080fd5b505af1158015620006ae573d6000803e3d6000fd5b50506009546001600160a01b031660009081526035602081905260408083208054600160ff1991821681179092553085529184208054909216811790915593509150620006fa62000824565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905560085490911681526035835290812080549093166001179092556022905260647fb84cf808d0d5b1ad44962c9bfddd3cfce67763c49ab557cfd0e9f6804faade9955603c7fe39b43e4224876d80510ac9d8f190663bcce357e28a4aec26f3bf2e600bb40ec556002905260287f52978eb6718a0ed733b71dbb3c4781d6da146a41523832713c09679420d0cac5556003602355620007c562000904565b6001603a6000620007d562000824565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556200081a6200080b62000824565b670de0b6b3a764000062000959565b62000d1c565b3390565b6005546001600160a01b031690565b6001600160a01b0382166000908152603660205260409020805460ff19168215801591909117909155620008c85760085460405163031e79db60e41b81526001600160a01b03909116906331e79db0906200089390859060040162000c74565b600060405180830381600087803b158015620008ae57600080fd5b505af1158015620008c3573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6000805b60235481121562000945576000818152602260205260409020546200092e908362000aee565b9150806200093c8162000cd7565b91505062000908565b506200095360648262000cf9565b60215550565b6001600160a01b038216620009b55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b620009d18160025462000a5e60201b620035651790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a049183906200356562000a5e821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b60008062000a6d838562000aee565b90508381101562000ac15760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620009ac565b90505b92915050565b612ff780620067cb83390190565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000ac45762000ac462000ad8565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000b2f57607f821691505b60208210810362000b5057634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a5957600081815260208120601f850160051c8101602086101562000b7f5750805b601f850160051c820191505b8181101562000ba05782815560010162000b8b565b505050505050565b81516001600160401b0381111562000bc45762000bc462000b04565b62000bdc8162000bd5845462000b1a565b8462000b56565b602080601f83116001811462000c14576000841562000bfb5750858301515b600019600386901b1c1916600185901b17855562000ba0565b600085815260208120601f198616915b8281101562000c455788860151825594840194600190910190840162000c24565b508582101562000c645787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b0391909116815260200190565b60006020828403121562000c9b57600080fd5b81516001600160a01b038116811462000ac157600080fd5b60006020828403121562000cc657600080fd5b8151801515811462000ac157600080fd5b60006001600160ff1b01820162000cf25762000cf262000ad8565b5060010190565b60008262000d1757634e487b7160e01b600052601260045260246000fd5b500490565b615a9f8062000d2c6000396000f3fe6080604052600436106105655760003560e01c8063871c128d116102c1578063871c128d14610db657806388a9d55414610dd657806388bdd9be14610deb5780638a8c523c14610e0b5780638da5cb5b14610e205780638f3fa86014610e35578063906e9dd014610e4b578063913c7df614610e6b57806395d89b4114610e9857806398118cb414610ead5780639a7a23d614610ec35780639b45900814610ee35780639c1b8af514610efe5780639c3372ea14610f145780639d325abd14610f34578063a18a7bfc14610f49578063a3e1096e14610f69578063a3ec8c8914610f7f578063a457c2d714610f9a578063a5ece94114610fba578063a8b9d24014610fda578063a9059cbb14610ffa578063ad56c13c1461101a578063ad8e749514611071578063b62496f51461109e578063b8429e05146110ce578063ba079d49146110e8578063bc7f25e414611108578063befa65aa14611128578063c02466681461113e578063c07b528a1461115e578063c32c293d1461118b578063c64e5aa0146111ab578063ce7d83f6146111c1578063d07a091c146111e1578063d35e3cd014611201578063d37e095214611217578063d46980161461122d578063d564af3a1461124d578063d5a1b7191461126d578063d5e37251146112dc578063d8032ed3146112fc578063db74559b1461131c578063dd62ed3e14611349578063e2f456051461138f578063e37ba8f9146113a5578063e409bfad146113c5578063e718ae92146113db578063e7300d3b146113fb578063e76e98621461141b578063e7841ec014611431578063ea1644d514611446578063ea2290ba14611466578063ec0d3fb114611486578063f1c0ddff1461149c578063f27fd254146114c9578063f2fde38b146114e9578063f5d3c79a14611509578063f94ce0d214611529578063fa95619614611549578063fb0b8dc01461156957600080fd5b806301abc132146105715780630224e9a71461059357806306fdde03146105bc57806309239b2b146105de578063095ea7b3146105fe5780630ef35b7e1461062e57806313616b4a1461064e5780631694505e1461066e57806318160ddd1461069b57806318ad81f8146106b05780631a676afa146106f15780631e093e941461071157806323b872dd1461073a57806324acbd691461075a5780632a84ff51146107905780632c1f5216146107d357806330bb4cff146107f3578063313ce567146108085780633599bb171461082457806337e84502146108445780633944784d1461086457806339509351146108885780633c295986146108a857806340ffdd80146108be578063435c89e4146108de57806343e716fe1461090b578063446d49da1461092b578063457ffca2146109415780634625830e1461096157806346585f741461098157806349bd5a5e146109975780634a74bb02146109b75780634ad12ec0146109d15780634ada218b146109e75780634e71d92d14610a085780634fbee19314610a1d57806350a0ccac14610a565780635123425b14610a6c5780635424226d14610a8c578063551e5f8d14610ab95780635764b7c414610ad95780635b72c18c14610b0f5780635e52a00b14610b2f5780635eb402a414610b655780636094c4ce14610b9257806363b4bc5314610bbf57806364b0f65314610bdf57806365b8dbc014610bf45780636843cd8414610c145780636d48467b14610c345780636e94729814610c54578063700bb19114610c6757806370a0823114610c875780637b0bbe9714610ca75780637b1a490914610cbd5780637d32f34214610cdd578063838a538614610d0a578063847ff70214610d2a57806384ae2bc614610d4a57806385e12a9414610d60578063868730c714610d9657600080fd5b3661056c57005b600080fd5b34801561057d57600080fd5b5061059161058c3660046151f4565b61157f565b005b34801561059f57600080fd5b506105a9600f5481565b6040519081526020015b60405180910390f35b3480156105c857600080fd5b506105d16116f6565b6040516105b39190615226565b3480156105ea57600080fd5b506105a96105f9366004615289565b611788565b34801561060a57600080fd5b5061061e6106193660046152a6565b6117a3565b60405190151581526020016105b3565b34801561063a57600080fd5b506105916106493660046152d2565b6117ba565b34801561065a57600080fd5b506105916106693660046152f4565b6118ad565b34801561067a57600080fd5b5060065461068e906001600160a01b031681565b6040516105b39190615336565b3480156106a757600080fd5b506002546105a9565b3480156106bc57600080fd5b5061068e6106cb3660046152a6565b601a6020908152600092835260408084209091529082529020546001600160a01b031681565b3480156106fd57600080fd5b5061059161070c36600461534a565b611912565b34801561071d57600080fd5b50602c54602d54602e54602f546040516105b39493929190615376565b34801561074657600080fd5b5061061e610755366004615391565b611954565b34801561076657600080fd5b506105a9610775366004615289565b6001600160a01b031660009081526024602052604090205490565b34801561079c57600080fd5b5061068e6107ab3660046152a6565b6001600160a01b039182166000908152601a6020908152604080832093835292905220541690565b3480156107df57600080fd5b5060085461068e906001600160a01b031681565b3480156107ff57600080fd5b506105a96119bd565b34801561081457600080fd5b50604051600981526020016105b3565b34801561083057600080fd5b5061059161083f3660046153e0565b611a30565b34801561085057600080fd5b5061059161085f3660046152d2565b611abd565b34801561087057600080fd5b50610879611b3e565b6040516105b3939291906153fd565b34801561089457600080fd5b5061061e6108a33660046152a6565b611b89565b3480156108b457600080fd5b506105a9600e5481565b3480156108ca57600080fd5b506105916108d93660046153e0565b611bbf565b3480156108ea57600080fd5b506105a96108f9366004615413565b60396020526000908152604090205481565b34801561091757600080fd5b50610591610926366004615413565b611c1a565b34801561093757600080fd5b506105a960295481565b34801561094d57600080fd5b5061059161095c36600461542c565b611c6d565b34801561096d57600080fd5b5061059161097c366004615413565b611d07565b34801561098d57600080fd5b506105a960315481565b3480156109a357600080fd5b5060075461068e906001600160a01b031681565b3480156109c357600080fd5b5060335461061e9060ff1681565b3480156109dd57600080fd5b506105a960305481565b3480156109f357600080fd5b5060075461061e90600160b01b900460ff1681565b348015610a1457600080fd5b50610591611d4d565b348015610a2957600080fd5b5061061e610a38366004615289565b6001600160a01b031660009081526035602052604090205460ff1690565b348015610a6257600080fd5b506105a960125481565b348015610a7857600080fd5b50610591610a87366004615467565b611dc6565b348015610a9857600080fd5b506105a9610aa7366004615289565b60276020526000908152604090205481565b348015610ac557600080fd5b50610591610ad4366004615413565b611edd565b348015610ae557600080fd5b506105a9610af4366004615289565b6001600160a01b031660009081526026602052604090205490565b348015610b1b57600080fd5b5061061e610b2a366004615289565b611f23565b348015610b3b57600080fd5b50336000908152601a602090815260408083208380529091529020546001600160a01b031661068e565b348015610b7157600080fd5b506105a9610b80366004615413565b60226020526000908152604090205481565b348015610b9e57600080fd5b506105a9610bad366004615289565b60256020526000908152604090205481565b348015610bcb57600080fd5b50610591610bda3660046152f4565b611f95565b348015610beb57600080fd5b506105a961208b565b348015610c0057600080fd5b50610591610c0f366004615289565b6120d5565b348015610c2057600080fd5b506105a9610c2f366004615289565b61219c565b348015610c4057600080fd5b5061061e610c4f366004615289565b61220e565b348015610c6057600080fd5b50476105a9565b348015610c7357600080fd5b50610591610c82366004615413565b61223f565b348015610c9357600080fd5b506105a9610ca2366004615289565b6122fb565b348015610cb357600080fd5b506105a9601d5481565b348015610cc957600080fd5b50610591610cd83660046152a6565b612316565b348015610ce957600080fd5b506105a9610cf8366004615289565b60386020526000908152604090205481565b348015610d1657600080fd5b50610591610d2536600461534a565b612376565b348015610d3657600080fd5b50610591610d45366004615289565b6123ae565b348015610d5657600080fd5b506105a960215481565b348015610d6c57600080fd5b506105a9610d7b366004615289565b6001600160a01b031660009081526025602052604090205490565b348015610da257600080fd5b50610591610db13660046153e0565b6123fa565b348015610dc257600080fd5b50610591610dd1366004615413565b61242c565b348015610de257600080fd5b506105a96124d5565b348015610df757600080fd5b50610591610e06366004615289565b6124e0565b348015610e1757600080fd5b5061059161278b565b348015610e2c57600080fd5b5061068e61282f565b348015610e4157600080fd5b506105a9600c5481565b348015610e5757600080fd5b50610591610e66366004615289565b61283e565b348015610e7757600080fd5b506105a9610e86366004615413565b60009081526022602052604090205490565b348015610ea457600080fd5b506105d161288a565b348015610eb957600080fd5b506105a960115481565b348015610ecf57600080fd5b50610591610ede366004615467565b612899565b348015610eef57600080fd5b50601954601754601854610879565b348015610f0a57600080fd5b506105a960345481565b348015610f2057600080fd5b50610591610f2f3660046153e0565b6128ec565b348015610f4057600080fd5b506023546105a9565b348015610f5557600080fd5b50610591610f64366004615289565b612948565b348015610f7557600080fd5b506105a960105481565b348015610f8b57600080fd5b50603054603154603254610879565b348015610fa657600080fd5b5061061e610fb53660046152a6565b612be6565b348015610fc657600080fd5b50600a5461068e906001600160a01b031681565b348015610fe657600080fd5b506105a9610ff5366004615289565b612c35565b34801561100657600080fd5b5061061e6110153660046152a6565b612c66565b34801561102657600080fd5b5061103a611035366004615289565b612c73565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016105b3565b34801561107d57600080fd5b506105a961108c366004615289565b60286020526000908152604090205481565b3480156110aa57600080fd5b5061061e6110b9366004615289565b60366020526000908152604090205460ff1681565b3480156110da57600080fd5b5060205461061e9060ff1681565b3480156110f457600080fd5b5061061e611103366004615289565b612d05565b34801561111457600080fd5b5061068e611123366004615289565b612d36565b34801561113457600080fd5b506105a960135481565b34801561114a57600080fd5b50610591611159366004615467565b612d5f565b34801561116a57600080fd5b506105a9611179366004615289565b60266020526000908152604090205481565b34801561119757600080fd5b5061068e6111a6366004615289565b612e15565b3480156111b757600080fd5b506105a960155481565b3480156111cd57600080fd5b506105a96111dc366004615289565b612e87565b3480156111ed57600080fd5b506105916111fc366004615289565b612ee1565b34801561120d57600080fd5b506105a9602a5481565b34801561122357600080fd5b506105a9601e5481565b34801561123957600080fd5b5060095461068e906001600160a01b031681565b34801561125957600080fd5b50610591611268366004615413565b612f6f565b34801561127957600080fd5b506112b7611288366004615413565b6000908152601f6020908152604080832054601e546001600160a01b03909116808552601c9093529220549092565b604080516001600160a01b0390941684526020840192909252908201526060016105b3565b3480156112e857600080fd5b506105916112f73660046153e0565b613023565b34801561130857600080fd5b50610591611317366004615289565b6130ac565b34801561132857600080fd5b506105a9611337366004615289565b60246020526000908152604090205481565b34801561135557600080fd5b506105a96113643660046154a0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561139b57600080fd5b506105a9600d5481565b3480156113b157600080fd5b506105916113c0366004615289565b6131e2565b3480156113d157600080fd5b506105a960325481565b3480156113e757600080fd5b506105916113f63660046153e0565b613274565b34801561140757600080fd5b506105916114163660046151f4565b6132fe565b34801561142757600080fd5b506105a960165481565b34801561143d57600080fd5b506105a961333c565b34801561145257600080fd5b50610591611461366004615413565b613386565b34801561147257600080fd5b50600b5461068e906001600160a01b031681565b34801561149257600080fd5b506105a9602b5481565b3480156114a857600080fd5b506105a96114b7366004615289565b60376020526000908152604090205481565b3480156114d557600080fd5b5061103a6114e4366004615413565b6133b5565b3480156114f557600080fd5b50610591611504366004615289565b6133f3565b34801561151557600080fd5b506105916115243660046153e0565b6134de565b34801561153557600080fd5b5061061e611544366004615289565b613510565b34801561155557600080fd5b50610591611564366004615413565b61352e565b34801561157557600080fd5b506105a960145481565b6005546001600160a01b031633146115b25760405162461bcd60e51b81526004016115a9906154ce565b60405180910390fd5b60028211156115d35760405162461bcd60e51b81526004016115a990615503565b60028111156115f45760405162461bcd60e51b81526004016115a990615503565b600a8411156116435760405162461bcd60e51b815260206004820152601b60248201527a43616e6e6f74207365742064657620666565206f7665722031302560281b60448201526064016115a9565b600a83111561169e5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f7420736574206c697175696469747920666565206f7665722031306044820152602560f81b60648201526084016115a9565b60108490556012839055601482905560168190556040517f7930d77b0ffd67679071b576440d6e525f442ff3f55db20413eed41d88c81583906116e8908690869086908690615376565b60405180910390a150505050565b60606003805461170590615538565b80601f016020809104026020016040519081016040528092919081815260200182805461173190615538565b801561177e5780601f106117535761010080835404028352916020019161177e565b820191906000526020600020905b81548152906001019060200180831161176157829003601f168201915b5050505050905090565b6001600160a01b03166000908152601c602052604090205490565b60006117b03384846135c9565b5060015b92915050565b6005546001600160a01b031633146117e45760405162461bcd60e51b81526004016115a9906154ce565b6000828152603960205260409020548190036117ff57600080fd5b60648111156118505760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e27742065786365656420313030000060448201526064016115a9565b6000811161189b5760405162461bcd60e51b815260206004820152601860248201527705374616b696e6720626f6e75732063616e277420626520360441b60448201526064016115a9565b60009182526039602052604090912055565b6005546001600160a01b031633146118d75760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b039283166000908152601a602090815260408083209483529390529190912080546001600160a01b03191691909216179055565b6005546001600160a01b0316331461193c5760405162461bcd60e51b81526004016115a9906154ce565b611945816136ee565b61194f83836137db565b505050565b6000611961848484613aaa565b6119b384336119ae856040518060600160405280602881526020016159fd602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614461565b6135c9565b5060019392505050565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2b9190615572565b905090565b6005546001600160a01b03163314611a5a5760405162461bcd60e51b81526004016115a9906154ce565b600854604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b158015611aa257600080fd5b505af1158015611ab6573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314611ae75760405162461bcd60e51b81526004016115a9906154ce565b6000828152602260205260409020819055611b0061449b565b60408051838152602081018390527fbfe4066ad4b56591d9738665ba86b038826d6ec196bd3e4c2305847c22eb02a891015b60405180910390a15050565b600554600090819081906001600160a01b03163314611b6f5760405162461bcd60e51b81526004016115a9906154ce565b611b776144e8565b50506030546031546032549193909250565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916117b09185906119ae9086613565565b6005546001600160a01b03163314611be95760405162461bcd60e51b81526004016115a9906154ce565b6008546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd8090602401611a88565b6005546001600160a01b03163314611c445760405162461bcd60e51b81526004016115a9906154ce565b6301312d00811115611c685760405162461bcd60e51b81526004016115a99061558b565b600d55565b6005546001600160a01b03163314611c975760405162461bcd60e51b81526004016115a9906154ce565b600f8590556011849055601383905560158290556021819055604080518681526020810186905290810184905260608101839052608081018290527fda70e0b1954bcd95873c930c54e19a24ff3b2f024251a9eb0756e67a7794711e9060a0015b60405180910390a15050505050565b6005546001600160a01b03163314611d315760405162461bcd60e51b81526004016115a9906154ce565b600754600160b01b900460ff1615611d4857600080fd5b604455565b60085460405163bc4c4b3760e01b81526001600160a01b039091169063bc4c4b3790611d809033906000906004016155d2565b6020604051808303816000875af1158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc391906155ed565b50565b6005546001600160a01b03163314611df05760405162461bcd60e51b81526004016115a9906154ce565b306001600160a01b03831603611e485760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420757365206e617469766520746f6b656e20616464726573730060448201526064016115a9565b600854604051635123425b60e01b81526001600160a01b0390911690635123425b90611e7a90859085906004016155d2565b600060405180830381600087803b158015611e9457600080fd5b505af1158015611ea8573d6000803e3d6000fd5b505050507ff8e5e8c18b9fbb7607019e8dab60e0ad981ba259df038a668fc13025a64854d68282604051611b329291906155d2565b6005546001600160a01b03163314611f075760405162461bcd60e51b81526004016115a9906154ce565b600754600160b01b900460ff1615611f1e57600080fd5b604355565b6008546040516316dcb06360e21b81526000916001600160a01b031690635b72c18c90611f54908590600401615336565b602060405180830381865afa158015611f71573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b491906155ed565b6005546001600160a01b03163314611fbf5760405162461bcd60e51b81526004016115a9906154ce565b306001600160a01b038416036120145760405162461bcd60e51b815260206004820152601a60248201527921b0b73737ba103932b6b7bb32903730ba34bb32903a37b5b2b760311b60448201526064016115a9565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90612042908490869060040161560a565b6020604051808303816000875af1158015612061573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208591906155ed565b50505050565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611a07573d6000803e3d6000fd5b6005546001600160a01b031633146120ff5760405162461bcd60e51b81526004016115a9906154ce565b6006546001600160a01b039081169082160361211a57600080fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0383811691909117909155600854604051630196e36f60e61b81529116906365b8dbc090611a88908490600401615336565b6008546040516370a0823160e01b81526000916001600160a01b0316906370a08231906121cd908590600401615336565b602060405180830381865afa1580156121ea573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b49190615572565b600854604051636d48467b60e01b81526000916001600160a01b031690636d48467b90611f54908590600401615336565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015612292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b69190615623565b925092509250326001600160a01b031660001515600080516020615957833981519152858585896040516122ed9493929190615376565b60405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146123405760405162461bcd60e51b81526004016115a9906154ce565b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561194f573d6000803e3d6000fd5b6005546001600160a01b031633146123a05760405162461bcd60e51b81526004016115a9906154ce565b603092909255603155603255565b6005546001600160a01b031633146123d85760405162461bcd60e51b81526004016115a9906154ce565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051638bc1d63960e01b81526001600160a01b0390911690638bc1d63990611a8890339085906004016155d2565b6005546001600160a01b031633146124565760405162461bcd60e51b81526004016115a9906154ce565b62030d40811015801561246c57506207a1208111155b6124d05760405162461bcd60e51b815260206004820152602f60248201527f6e6577206761732076616c7565206d757374206265206265747765656e20323060448201526e03030303020616e642035303030303608c1b60648201526084016115a9565b603455565b6000611a2b306122fb565b6005546001600160a01b0316331461250a5760405162461bcd60e51b81526004016115a9906154ce565b6008546001600160a01b039081169082160361252557600080fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612572573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125969190615651565b6001600160a01b0316146125a957600080fd5b60405163031e79db60e41b81526001600160a01b038216906331e79db0906125d5908490600401615336565b600060405180830381600087803b1580156125ef57600080fd5b505af1158015612603573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b03841692506331e79db09150612633903090600401615336565b600060405180830381600087803b15801561264d57600080fd5b505af1158015612661573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db061267c61282f565b6040518263ffffffff1660e01b81526004016126989190615336565b600060405180830381600087803b1580156126b257600080fd5b505af11580156126c6573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b0380861694506331e79db093506126fa921690600401615336565b600060405180830381600087803b15801561271457600080fd5b505af1158015612728573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b031633146127b55760405162461bcd60e51b81526004016115a9906154ce565b600754600160b01b900460ff16156128095760405162461bcd60e51b81526020600482015260176024820152761d1c98591a5b99c8185b1c9958591e48195b98589b1959604a1b60448201526064016115a9565b6007805460ff60b01b1916600160b01b1790556020805460ff1916600117905543604255565b6005546001600160a01b031690565b6005546001600160a01b031633146128685760405162461bcd60e51b81526004016115a9906154ce565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60606004805461170590615538565b6005546001600160a01b031633146128c35760405162461bcd60e51b81526004016115a9906154ce565b6007546001600160a01b03908116908316036128de57600080fd5b6128e88282614620565b5050565b6005546001600160a01b031633146129165760405162461bcd60e51b81526004016115a9906154ce565b600854604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea90602401611a88565b6001600160a01b0381166129955760405162461bcd60e51b81526020600482015260146024820152732737ba1030903b30b634b2103932b332b93932b960611b60448201526064016115a9565b336001600160a01b038216036129e95760405162461bcd60e51b81526020600482015260196024820152782cb7ba9031b0b73737ba103932b332b9103cb7bab939b2b63360391b60448201526064016115a9565b336000908152601a602090815260408083208380529091529020546001600160a01b031615612a585760405162461bcd60e51b815260206004820152601b60248201527a52656665727265722063616e6e6f74206265206368616e6765642160281b60448201526064016115a9565b336000908152601a60209081526040808320838052825280832080546001600160a01b0319166001600160a01b03861690811790915583526024909152902054612aa3906001615684565b6001600160a01b0382166000908152602460205260408120919091555b6001602354612acf9190615697565b811215612b96576001600160a01b038083166000908152601a602090815260408083208584529091529020541680612b075750612b96565b336000908152601a602052604081208291612b238560016156be565b81526020808201929092526040908101600090812080546001600160a01b0319166001600160a01b0395861617905592841683526025909152902054612b6a906001615684565b6001600160a01b0390911660009081526025602052604090205580612b8e816156e6565b915050612ac0565b50602d54602e54602f5460405133936001600160a01b038616937f2311833a6b34f4f41fdf892d645b68a6ccfeaec5f489c18070af21710258577193612bdb936153fd565b60405180910390a350565b60006117b033846119ae85604051806060016040528060258152602001615a45602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614461565b6008546040516302a2e74960e61b81526000916001600160a01b03169063a8b9d240906121cd908590600401615336565b60006117b0338484613aaa565b60085460405163fbcbc0f160e01b8152600091829182918291829182916001600160a01b039091169063fbcbc0f190612cb0908a90600401615336565b60c060405180830381865afa158015612ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf19190615705565b949c939b5091995097509550909350915050565b60085460405163ba079d4960e01b81526000916001600160a01b03169063ba079d4990611f54908590600401615336565b6001600160a01b039081166000908152601a602090815260408083208380529091529020541690565b6005546001600160a01b03163314612d895760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b03821660009081526035602052604090205481151560ff909116151503612db657600080fd5b6001600160a01b038216600081815260356020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b60085460405163c32c293d60e01b81526000916001600160a01b03169063c32c293d90612e46908590600401615336565b602060405180830381865afa158015612e63573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b49190615651565b6000805b602354811215612ed7576001600160a01b038381166000908152601a6020908152604080832085845290915290205416612ec55792915050565b80612ecf816156e6565b915050612e8b565b5060001992915050565b6005546001600160a01b03163314612f0b5760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b038181166000908152603a602090815260408083208054600160ff19918216811790925560359093529281902080549092169092179055600854905163031e79db60e41b81529116906331e79db090611a88908490600401615336565b6005546001600160a01b03163314612f995760405162461bcd60e51b81526004016115a9906154ce565b600d548111612ffa5760405162461bcd60e51b815260206004820152602760248201527f4d617820616d6f756e74206d7573742062652067726561746572207468616e206044820152666d696e696d756d60c81b60648201526084016115a9565b6301312d0081111561301e5760405162461bcd60e51b81526004016115a99061558b565b600e55565b6005546001600160a01b0316331461304d5760405162461bcd60e51b81526004016115a9906154ce565b60335481151560ff90911615150361306457600080fd5b6033805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef906020015b60405180910390a150565b60006130b7336122fb565b116131385760405162461bcd60e51b815260206004820152604560248201527f596f75206d757374206f776e206d6f7265207468616e207a65726f202452554660448201527f4620746f6b656e7320746f2073776974636820796f7572207061796f757420746064820152646f6b656e2160d81b608482015260a4016115a9565b306001600160a01b0382160361314d57600080fd5b60085460405163f7dd53a960e01b81526001600160a01b039091169063f7dd53a99061317f9033908590600401615758565b600060405180830381600087803b15801561319957600080fd5b505af11580156131ad573d6000803e3d6000fd5b505050507f3640c981ed7cfa9e689ac4e9cafffd8c9240b716b14c982b3e90d54e7b61de2433826040516130a1929190615758565b6005546001600160a01b0316331461320c5760405162461bcd60e51b81526004016115a9906154ce565b613217816001612d5f565b6009546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b60205460ff166132de5760405162461bcd60e51b815260206004820152602f60248201527f436f6e76657274696e6720726566657272616c2072657761726473206973206e60448201526e6f7420656e61626c6564207965742160881b60648201526084016115a9565b336000908152601b60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146133285760405162461bcd60e51b81526004016115a9906154ce565b602c93909355602d91909155602e55602f55565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611a07573d6000803e3d6000fd5b6005546001600160a01b031633146133b05760405162461bcd60e51b81526004016115a9906154ce565b600c55565b600854604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612cb0565b6005546001600160a01b0316331461341d5760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b0381166134825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016115a9565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051632c8be28160e21b81526001600160a01b039091169063b22f8a0490611a8890339085906004016155d2565b6001600160a01b03166000908152601b602052604090205460ff1690565b6005546001600160a01b031633146135585760405162461bcd60e51b81526004016115a9906154ce565b6023819055611dc361449b565b6000806135728385615684565b9050838110156135c25760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b60448201526064016115a9565b9392505050565b6001600160a01b03831661362b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016115a9565b6001600160a01b03821661368c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016115a9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6136f7306122fb565b811115613723576000805160206159978339815191526000806000806040516130a19493929190615772565b600e548111156137325750600e545b600061373f8260026146ec565b9050600061374d838361472b565b905081158061375a575080155b1561376457505050565b4761376f833061476d565b8260186000828254613781919061578f565b9091555060009050613793478361472b565b905061379f83826148f0565b82601860008282546137b1919061578f565b909155505060405160008051602061599783398151915290611cf890869084908790600190615772565b6137e4306122fb565b6137ee8284615684565b1115613816576000805160206159dd83398151915282826000604051611b32939291906157a2565b600080600e5484111561382957600e5493505b479150613836843061476d565b613840824761578f565b90508360196000828254613854919061578f565b9091555081905084613864575060005b6008546040516000916001600160a01b03169083908381818185875af1925050503d80600081146138b1576040519150601f19603f3d011682016040523d82523d6000602084013e6138b6565b606091505b50509050600e548511156138ca57600e5494505b4793506138d7853061476d565b6138e1844761578f565b925084601760008282546138f5919061578f565b9091555083905085613905575060005b60006139126002836157ba565b600a546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114613964576040519150601f19603f3d011682016040523d82523d6000602084013e613969565b606091505b50509050806139ba5760405162461bcd60e51b815260206004820152601e60248201527f53656e64696e6720424e4220746f2077616c6c65742031206661696c6564000060448201526064016115a9565b600b546040516000916001600160a01b03169084908381818185875af1925050503d8060008114613a07576040519150601f19603f3d011682016040523d82523d6000602084013e613a0c565b606091505b5050905080613a5d5760405162461bcd60e51b815260206004820152601e60248201527f53656e64696e6720424e4220746f2077616c6c65742032206661696c6564000060448201526064016115a9565b6000828015613a695750815b90506000805160206159dd8339815191528786888015613a865750835b604051613a95939291906157a2565b60405180910390a15050505050505050505050565b6001600160a01b038316613ad05760405162461bcd60e51b81526004016115a9906157dc565b600754600160b01b900460ff1680613b0057506001600160a01b0383166000908152603a602052604090205460ff165b613b4c5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c656460448201526064016115a9565b6007546001600160a01b03848116911614613bd157306001600160a01b03831603613bd15760405162461bcd60e51b815260206004820152602f60248201527f596f752063616e6e6f742073656e6420746f6b656e7320746f2074686520636f60448201526e6e747261637420616464726573732160881b60648201526084016115a9565b80600003613be55761194f8383600061499d565b600754600160a01b900460ff16158015613c1857506001600160a01b03831660009081526035602052604090205460ff16155b8015613c3d57506001600160a01b03821660009081526035602052604090205460ff16155b8015613c6d57506007546001600160a01b0383811691161480613c6d57506007546001600160a01b038481169116145b15614378576001600160a01b038216600090815260366020526040812054600f54603c55601154603d55601354603e55601554603f5560ff16908080613cb286612d36565b6001600160a01b031614158015613cc7575082155b15613cf45760019150613cd985612d36565b601054600f5560125460115560145460135560165460155590505b604354604254613d049190615684565b431015613d2157604454600f556000601181905560138190556015555b6007546001600160a01b03868116911614613da657600c5484613d43876122fb565b613d4d9190615684565b10613da65760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a2042616c616e636520657863656564732077616c6c65742073696044820152627a652160e81b60648201526084016115a9565b6000613db1306122fb565b90506000601e54118015613dc7575060205460ff165b8015613dd05750835b15613e5657601d546000908152601f6020526040812054613df9906001600160a01b0316611788565b905060008111613e1d57601d8054906000613e1383615821565b9190505550613e54565b600e54811115613e2c5750600e545b601d546000908152601f6020526040902054613e5490899083906001600160a01b0316614ae2565b505b600d5481108015908190613e8357506001600160a01b03881660009081526036602052604090205460ff16155b15613ecd576007805460ff60a01b1916600160a01b17905560335460ff1615613eb157613eb16018546136ee565b613ebf6019546017546137db565b6007805460ff60a01b191690555b85603b819055506000613ef66064613ef06021548a61507a90919063ffffffff16565b906146ec565b905084156141845760005b602354811215614149576001600160a01b03808a166000908152601a602090815260408083208584528252808320546022909252822054603b549190931692613f529161271091613ef0919061507a565b90506001600160a01b038216613f69575050614149565b613f738a8261472b565b9950613f7e82613510565b1580613f8d575060205460ff16155b156140a057613f9d8c838361499d565b6008546001600160a01b031663e30443bc83613fb8816150fc565b6040518363ffffffff1660e01b8152600401613fd592919061560a565b600060405180830381600087803b158015613fef57600080fd5b505af1158015614003573d6000803e3d6000fd5b505050506001600160a01b0382166000908152602660205260408120805483929061402f908490615684565b9250508190555080602960008282546140489190615684565b909155506140589050818561578f565b935060001981836001600160a01b0316600080516020615a258339815191528f602d54602e54602f548a604051614093959493929190615833565b60405180910390a4614134565b6140ab8c308361499d565b60006140b683611788565b116140f957601e80546000908152601f6020526040812080546001600160a01b0319166001600160a01b038616179055815491906140f383615821565b91905055505b6001600160a01b0382166000908152601c602052604081208054839290614121908490615684565b909155506141319050818561578f565b93505b50508080614141906156e6565b915050613f01565b50801561417f5761415a878261472b565b965061416789308361499d565b80601960008282546141799190615684565b90915550505b6141b8565b856141b857614193878261472b565b96506141a089308361499d565b80601960008282546141b29190615684565b90915550505b6000866141c7576013546141cb565b6015545b905060006141eb6064613ef0600f54603b5461507a90919063ffffffff16565b9050600061420b6064613ef0601154603b5461507a90919063ffffffff16565b905060006142296064613ef086603b5461507a90919063ffffffff16565b9050826017600082825461423d9190615684565b9250508190555081601860008282546142569190615684565b92505081905550806019600082825461426f9190615684565b9091555060009050816142828486615684565b61428c9190615684565b90506142988c8261472b565b9b506142a58e308361499d565b6034546008546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015614312575060408051601f3d908101601f1916820190925261430f91810190615623565b60015b1561434c57604051329060019060008051602061595783398151915290614340908790879087908b90615376565b60405180910390a35050505b8a1561436b57603c54600f55603d54601155603e54601355603f546015555b5050505050505050505050505b61438383838361499d565b6008546001600160a01b031663e30443bc8461439e816150fc565b6040518363ffffffff1660e01b81526004016143bb92919061560a565b600060405180830381600087803b1580156143d557600080fd5b505af11580156143e9573d6000803e3d6000fd5b50506008546001600160a01b0316915063e30443bc90508361440a816150fc565b6040518363ffffffff1660e01b815260040161442792919061560a565b600060405180830381600087803b15801561444157600080fd5b505af1158015614455573d6000803e3d6000fd5b5050505061194f6144e8565b600081848411156144855760405162461bcd60e51b81526004016115a99190615226565b506000614492848661578f565b95945050505050565b6000805b6023548112156144d6576000818152602260205260409020546144c29083615684565b9150806144ce816156e6565b91505061449f565b506144e26064826157ba565b60215550565b603054421061454e57602d805490600061450183615821565b90915550614513905042612198615684565b603055602d546000805160206159778339815191529060019061453790829061578f565b604051614545929190615861565b60405180910390a15b60315442106145b657602e805490600061456783615821565b9091555061457a90504262093a80615684565b603155602e546000805160206159778339815191529060029061459f9060019061578f565b6040516145ad929190615861565b60405180910390a15b603254421061461e57602f80549060006145cf83615821565b909155506145e29050426228206f615684565b603255602f54600080516020615977833981519152906003906146079060019061578f565b604051614615929190615861565b60405180910390a15b565b6001600160a01b0382166000908152603660205260409020805460ff191682158015919091179091556146b05760085460405163031e79db60e41b81526001600160a01b03909116906331e79db09061467d908590600401615336565b600060405180830381600087803b15801561469757600080fd5b505af11580156146ab573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60006135c283836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061515b565b60006135c283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614461565b60008211614779575050565b81614783306122fb565b101561479557614792306122fb565b91505b60408051600280825260608201835260009260208301908036833701905050905030816000815181106147ca576147ca615874565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148479190615651565b8160018151811061485a5761485a615874565b6001600160a01b03928316602091820292909201015260065461488091309116856135c9565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906148b99086906000908690889042906004016158ce565b600060405180830381600087803b1580156148d357600080fd5b505af11580156148e7573d6000803e3d6000fd5b50505050505050565b6006546149089030906001600160a01b0316846135c9565b60065460095460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015614978573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ab69190615623565b6001600160a01b0383166149c35760405162461bcd60e51b81526004016115a9906157dc565b6001600160a01b038216614a255760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016115a9565b614a62816040518060600160405280602681526020016159b7602691396001600160a01b0386166000908152602081905260409020549190614461565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614a919082613565565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016136e1565b60008211614aef57505050565b60085460405163c32c293d60e01b8152600091829182916001600160a01b03169063c32c293d90614b24908790600401615336565b602060405180830381865afa158015614b41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b659190615651565b6001600160a01b031603614c9457479150614b80848461476d565b614b8a478361472b565b6001600160a01b038416600090815260276020526040812080549293508692909190614bb7908490615684565b9250508190555083602a6000828254614bd09190615684565b90915550506001600160a01b03831660009081526028602052604081208054839290614bfd908490615684565b9250508190555080602b6000828254614c169190615684565b90915550506001600160a01b0383166000818152601c60205260409081902054602d54602e54602f54935186959394600080516020615a2583398151915293614c68938d939192909160001990615833565b60405180910390a4614c78615189565b6045546001600160a01b0316614c8f575050505050565b614d43565b6045546001600160a01b0316614d4357479150614cb1843061476d565b614cbb478361472b565b6001600160a01b038416600090815260276020526040812080549293508692909190614ce8908490615684565b9250508190555083602a6000828254614d019190615684565b9091555050604580546001600160a01b038086166001600160a01b03199283161790925560468390556047805492881692909116919091179055611ab6615189565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015614dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dd19190615651565b81600081518110614de457614de4615874565b6001600160a01b03928316602091820292909201015260085460455460405163c32c293d60e01b81529183169263c32c293d92614e279290911690600401615336565b602060405180830381865afa158015614e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e689190615651565b81600181518110614e7b57614e7b615874565b6001600160a01b03928316602091820292909201015260065460465460455460405163b6f9de9560e01b81529284169363b6f9de9593614ec7926000928892911690429060040161590a565b6000604051808303818588803b158015614ee057600080fd5b505af193505050508015614ef2575060015b506046546045546001600160a01b031660009081526028602052604081208054909190614f20908490615684565b9091555050604654602b8054600090614f3a908490615684565b9091555050604654604554604754602d54602e54602f5460405186956001600160a01b0390811695600080516020615a2583398151915295614f86959290911693909260001990615833565b60405180910390a460085460405163c32c293d60e01b81526000916001600160a01b03169063c32c293d90614fbf908890600401615336565b602060405180830381865afa158015614fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150009190615651565b6001600160a01b03161461504857604580546001600160a01b038087166001600160a01b0319928316179092556046849055604780549289169290911691909117905561506a565b604580546001600160a01b031990811690915560006046556047805490911690555b615072615189565b505050505050565b60008260000361508c575060006117b4565b6000615098838561593f565b9050826150a585836157ba565b146135c25760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016115a9565b600754600090600160a81b900460ff1661511e57615119826122fb565b6117b4565b6001600160a01b0382166000908152603760205260409020546117b490606490613ef09061514c9083613565565b615155866122fb565b9061507a565b6000818361517c5760405162461bcd60e51b81526004016115a99190615226565b50600061449284866157ba565b601d80546000908152601f60208181526040808420546001600160a01b03168452601c825280842084905584548452919052812080546001600160a01b0319169055815491906151d883615821565b9190505550601e54601d541061461e576000601d819055601e55565b6000806000806080858703121561520a57600080fd5b5050823594602084013594506040840135936060013592509050565b600060208083528351808285015260005b8181101561525357858101830151858201604001528201615237565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611dc357600080fd5b60006020828403121561529b57600080fd5b81356135c281615274565b600080604083850312156152b957600080fd5b82356152c481615274565b946020939093013593505050565b600080604083850312156152e557600080fd5b50508035926020909101359150565b60008060006060848603121561530957600080fd5b833561531481615274565b925060208401359150604084013561532b81615274565b809150509250925092565b6001600160a01b0391909116815260200190565b60008060006060848603121561535f57600080fd5b505081359360208301359350604090920135919050565b93845260208401929092526040830152606082015260800190565b6000806000606084860312156153a657600080fd5b83356153b181615274565b925060208401356153c181615274565b929592945050506040919091013590565b8015158114611dc357600080fd5b6000602082840312156153f257600080fd5b81356135c2816153d2565b9283526020830191909152604082015260600190565b60006020828403121561542557600080fd5b5035919050565b600080600080600060a0868803121561544457600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561547a57600080fd5b823561548581615274565b91506020830135615495816153d2565b809150509250929050565b600080604083850312156154b357600080fd5b82356154be81615274565b9150602083013561549581615274565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f43616e6e6f742073657420424e4272657761726420666565206f766572203225604082015260600190565b600181811c9082168061554c57607f821691505b60208210810361556c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561558457600080fd5b5051919050565b60208082526027908201527f63616e6e6f7420736574207377617020616d6f756e742067726561746572207460408201526668616e202e322560c81b606082015260800190565b6001600160a01b039290921682521515602082015260400190565b6000602082840312156155ff57600080fd5b81516135c2816153d2565b6001600160a01b03929092168252602082015260400190565b60008060006060848603121561563857600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561566357600080fd5b81516135c281615274565b634e487b7160e01b600052601160045260246000fd5b808201808211156117b4576117b461566e565b81810360008312801583831316838312821617156156b7576156b761566e565b5092915050565b80820182811260008312801582168215821617156156de576156de61566e565b505092915050565b60006001600160ff1b0182016156fe576156fe61566e565b5060010190565b60008060008060008060c0878903121561571e57600080fd5b865161572981615274565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6001600160a01b0392831681529116602082015260400190565b938452602084019290925260408301521515606082015260800190565b818103818111156117b4576117b461566e565b92835260208301919091521515604082015260600190565b6000826157d757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6000600182016156fe576156fe61566e565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b60ff929092168252602082015260400190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156158c35781516001600160a01b03168752958201959082019060010161589e565b509495945050505050565b85815284602082015260a0604082015260006158ed60a083018661588a565b6001600160a01b0394909416606083015250608001529392505050565b848152608060208201526000615923608083018661588a565b6001600160a01b03949094166040830152506060015292915050565b80820281158282048414176117b4576117b461566e56fec864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a982fc0b521dd59fa7e30ff6ab6b5392d216cb0bb977e9f16006d7b55b1d726b2935826dab182292d2e5b8adf2856697983c65b882fa567a247222747a43e606d1945524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63658e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd045524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636513556b7ecf6a9419a73bcfcb023a4c3f93d2d1991ed91cb718572f4e079ad3d245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122043b36a9766695d5643ba90bb6f80334e1b972bc0ef0992569d20f0b12b3d4d9c64736f6c6343000812003360c06040526014805462ff0000191690553480156200001d57600080fd5b5060405162002ff738038062002ff783398101604081905262000040916200016d565b60408051808201825260198082527f52756666527566665f4469766964656e645f547261636b6572000000000000006020808401829052845180860190955291845290830152908181600362000097838262000244565b506004620000a6828262000244565b50505050506000620000bd6200016960201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350601580546001600160a01b0319166001600160a01b0392909216919091179055633b9aca00608081905260a0526014805462ff0001600160b81b031916767a250d5630b4cf539739df2c5dacb4c659f2488d00010117905562000310565b3390565b6000602082840312156200018057600080fd5b81516001600160a01b03811681146200019857600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001ca57607f821691505b602082108103620001eb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200023f57600081815260208120601f850160051c810160208610156200021a5750805b601f850160051c820191505b818110156200023b5782815560010162000226565b5050505b505050565b81516001600160401b038111156200026057620002606200019f565b6200027881620002718454620001b5565b84620001f1565b602080601f831160018114620002b05760008415620002975750858301515b600019600386901b1c1916600185901b1785556200023b565b600085815260208120601f198616915b82811015620002e157888601518255948401946001909101908401620002c0565b5085821015620003005787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051612cb362000344600039600081816108eb01526114a20152600081816107a101526114ee0152612cb36000f3fe6080604052600436106102745760003560e01c806303c833021461028857806306fdde0314610290578063095ea7b3146102bb57806309bbedde146102eb5780631694505e1461030a57806318160ddd1461033e5780631d4ff89a14610353578063226cfa3d1461038357806323b872dd146103b057806327ce0147146103d05780633009a609146103f0578063313ce5671461040657806331e79db0146104225780633599bb1714610442578063395093511461046257806340ffdd801461048257806341808904146104a25780634e5ee1c0146104c15780634e7b827f146104f15780635123425b146105215780635183d6fd146105415780635b72c18c1461059857806365b8dbc0146105d15780636a474002146105f15780636b69163b146106065780636d48467b1461063657806370a082311461065657806370d3c747146106765780637bb4a991146106ac57806385a6b3ae146106cc5780638bc1d639146106e25780638da5cb5b1461070257806391b89fba1461072057806395d89b41146107405780639c3372ea146107555780639eec101e14610775578063a1363cda1461078f578063a4234069146107c3578063a457c2d7146107e3578063a8b9d24014610803578063a9059cbb14610823578063aafd847a14610843578063b22f8a0414610879578063ba079d4914610899578063bc4c4b37146108b9578063be10b614146108d9578063c32c293d1461090d578063d182f93414610946578063dd62ed3e1461095e578063e30443bc146109a4578063e7841ec0146109c4578063f2fde38b146109d9578063f7dd53a9146109f9578063fbcbc0f114610a19578063ffb2c47914610a3957600080fd5b3661028357610281610a74565b005b600080fd5b610281610a74565b34801561029c57600080fd5b506102a5610b07565b6040516102b291906127fb565b60405180910390f35b3480156102c757600080fd5b506102db6102d6366004612861565b610b99565b60405190151581526020016102b2565b3480156102f757600080fd5b50600a545b6040519081526020016102b2565b34801561031657600080fd5b5060145461033190630100000090046001600160a01b031681565b6040516102b2919061288d565b34801561034a57600080fd5b506002546102fc565b34801561035f57600080fd5b506102db61036e3660046128a1565b60116020526000908152604090205460ff1681565b34801561038f57600080fd5b506102fc61039e3660046128a1565b60166020526000908152604090205481565b3480156103bc57600080fd5b506102db6103cb3660046128be565b610bb0565b3480156103dc57600080fd5b506102fc6103eb3660046128a1565b610c19565b3480156103fc57600080fd5b506102fc600e5481565b34801561041257600080fd5b50604051600981526020016102b2565b34801561042e57600080fd5b5061028161043d3660046128a1565b610c72565b34801561044e57600080fd5b5061028161045d36600461290d565b610d3b565b34801561046e57600080fd5b506102db61047d366004612861565b610dda565b34801561048e57600080fd5b5061028161049d36600461290d565b610e10565b3480156104ae57600080fd5b506014546102db90610100900460ff1681565b3480156104cd57600080fd5b506102db6104dc3660046128a1565b60136020526000908152604090205460ff1681565b3480156104fd57600080fd5b506102db61050c3660046128a1565b600f6020526000908152604090205460ff1681565b34801561052d57600080fd5b5061028161053c36600461292a565b610ea2565b34801561054d57600080fd5b5061056161055c366004612963565b610ef7565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016102b2565b3480156105a457600080fd5b506102db6105b33660046128a1565b6001600160a01b031660009081526013602052604090205460ff1690565b3480156105dd57600080fd5b506102816105ec3660046128a1565b610f57565b3480156105fd57600080fd5b50610281610fad565b34801561061257600080fd5b506102db6106213660046128a1565b60106020526000908152604090205460ff1681565b34801561064257600080fd5b506102db6106513660046128a1565b611057565b34801561066257600080fd5b506102fc6106713660046128a1565b6110a3565b34801561068257600080fd5b506103316106913660046128a1565b6012602052600090815260409020546001600160a01b031681565b3480156106b857600080fd5b50601554610331906001600160a01b031681565b3480156106d857600080fd5b506102fc60085481565b3480156106ee57600080fd5b506102816106fd36600461292a565b6110be565b34801561070e57600080fd5b506009546001600160a01b0316610331565b34801561072c57600080fd5b506102fc61073b3660046128a1565b611113565b34801561074c57600080fd5b506102a561111e565b34801561076157600080fd5b5061028161077036600461290d565b61112d565b34801561078157600080fd5b506014546102db9060ff1681565b34801561079b57600080fd5b506102fc7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107cf57600080fd5b506014546102db9062010000900460ff1681565b3480156107ef57600080fd5b506102db6107fe366004612861565b6111af565b34801561080f57600080fd5b506102fc61081e3660046128a1565b6111fe565b34801561082f57600080fd5b506102db61083e366004612861565b61122a565b34801561084f57600080fd5b506102fc61085e3660046128a1565b6001600160a01b031660009081526007602052604090205490565b34801561088557600080fd5b5061028161089436600461292a565b611237565b3480156108a557600080fd5b506102db6108b43660046128a1565b61128c565b3480156108c557600080fd5b506102db6108d436600461292a565b6112d8565b3480156108e557600080fd5b506102fc7f000000000000000000000000000000000000000000000000000000000000000081565b34801561091957600080fd5b506103316109283660046128a1565b6001600160a01b039081166000908152601260205260409020541690565b34801561095257600080fd5b5060145460ff166102db565b34801561096a57600080fd5b506102fc61097936600461297c565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3480156109b057600080fd5b506102816109bf366004612861565b611456565b3480156109d057600080fd5b50600e546102fc565b3480156109e557600080fd5b506102816109f43660046128a1565b61152a565b348015610a0557600080fd5b50610281610a1436600461297c565b611615565b348015610a2557600080fd5b50610561610a343660046128a1565b6116e1565b348015610a4557600080fd5b50610a59610a54366004612963565b611790565b604080519384526020840192909252908201526060016102b2565b6000610a7f60025490565b11610a8957600080fd5b3415610b0557610abc610a9b60025490565b610aa934600160801b6118b5565b610ab391906129c0565b6005549061193e565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b01903461193e565b6008555b565b606060038054610b16906129e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610b42906129e2565b8015610b8f5780601f10610b6457610100808354040283529160200191610b8f565b820191906000526020600020905b815481529060010190602001808311610b7257829003601f168201915b5050505050905090565b6000610ba633848461199b565b5060015b92915050565b6000610bbd848484611abf565b610c0f8433610c0a85604051806060016040528060288152602001612c11602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611b24565b61199b565b5060019392505050565b6001600160a01b038116600090815260066020526040812054600160801b90610c6890610c6390610c5d610c58610c4f886110a3565b600554906118b5565b611b5e565b90611b6e565b611bac565b610baa91906129c0565b6009546001600160a01b03163314610ca55760405162461bcd60e51b8152600401610c9c90612a1c565b60405180910390fd5b6001600160a01b0381166000908152600f602052604090205460ff1615610ccb57600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610cf9908290611bbf565b610d04600a82611c12565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610d655760405162461bcd60e51b8152600401610c9c90612a1c565b801515601460029054906101000a900460ff16151503610d8457600080fd5b60148054821515620100000262ff0000199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610dcf90831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ba6918590610c0a908661193e565b6009546001600160a01b03163314610e3a5760405162461bcd60e51b8152600401610c9c90612a1c565b801515601460019054906101000a900460ff16151503610e5957600080fd5b601480548215156101000261ff00199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610dcf90831515815260200190565b6009546001600160a01b03163314610ecc5760405162461bcd60e51b8152600401610c9c90612a1c565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b600080600080600080610f09600a5490565b8710610f28575060009450600019935083925084915081905080610f4e565b6000610f35600a89611d4d565b9050610f40816116e1565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f815760405162461bcd60e51b8152600401610c9c90612a1c565b601480546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60405162461bcd60e51b815260206004820152606d60248201527f52756666527566665f4469766964656e645f547261636b65723a20776974686460448201527f7261774469766964656e642064697361626c65642e205573652074686520276360648201527f6c61696d272066756e6374696f6e206f6e20746865206d61696e20527566665260848201526c3ab3331031b7b73a3930b1ba1760991b60a482015260c401610c9c565b6009546000906001600160a01b031633146110845760405162461bcd60e51b8152600401610c9c90612a1c565b506001600160a01b031660009081526010602052604090205460ff1690565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b031633146110e85760405162461bcd60e51b8152600401610c9c90612a1c565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610baa826111fe565b606060048054610b16906129e2565b6009546001600160a01b031633146111575760405162461bcd60e51b8152600401610c9c90612a1c565b60145481151560ff90911615150361116e57600080fd5b6014805460ff19168215159081179091556040519081527f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890602001610dcf565b6000610ba63384610c0a85604051806060016040528060258152602001612c59602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611b24565b6001600160a01b038116600090815260076020526040812054610baa9061122484610c19565b90611d80565b6000610ba6338484611abf565b6009546001600160a01b031633146112615760405162461bcd60e51b8152600401610c9c90612a1c565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b031633146112b95760405162461bcd60e51b8152600401610c9c90612a1c565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146113055760405162461bcd60e51b8152600401610c9c90612a1c565b60145462010000900460ff161561131e57506000610baa565b6001600160a01b03831660009081526011602052604090205460ff168280156113445750805b80156113585750601454610100900460ff16155b15611367576000915050610baa565b60008161137c5761137785611dc2565b611385565b611385856120d5565b9050801561144b576001600160a01b038516600090815260166020526040902042905581156113f957831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c836040516113ec91815260200190565b60405180910390a3611440565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0928360405161143791815260200190565b60405180910390a35b600192505050610baa565b506000949350505050565b6009546001600160a01b031633146114805760405162461bcd60e51b8152600401610c9c90612a1c565b6001600160a01b0382166000908152600f602052604090205460ff166114de577f00000000000000000000000000000000000000000000000000000000000000008110156114e2576114d3600a83611c12565b6114de826000611bbf565b5050565b6114ec8282611bbf565b7f0000000000000000000000000000000000000000000000000000000000000000811061151f576114de600a8383612463565b6114de600a83611c12565b6009546001600160a01b031633146115545760405162461bcd60e51b8152600401610c9c90612a1c565b6001600160a01b0381166115b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c9c565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b0316331461163f5760405162461bcd60e51b8152600401610c9c90612a1c565b6001600160a01b03811660009081526013602052604090205460ff168061166d57506001600160a01b038116155b6116b35760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881b9bdd081a5b88185b1b1bddc81b1a5cdd604a1b6044820152606401610c9c565b6001600160a01b03918216600090815260126020526040902080546001600160a01b03191691909216179055565b806000808080806116f3600a8761250c565b945060001993506000851261175557600e5485111561172157600e5461171a908690612557565b9350611755565b600e54600a5460009110611736576000611745565b600e54600a5461174591611d80565b90506117518682611b6e565b9450505b61175e866111fe565b925061176986610c19565b6001600160a01b038716600090815260166020526040902054969895975093959294915050565b600a54600090819081908015806117af575060145462010000900460ff165b156117c5575050600e54600092508291506118ae565b600e546000805a90506000805b89841080156117e057508582105b1561189d57846117ef81612a51565b9550508585106117fe57600094505b6000600a600001868154811061181657611816612a6a565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff16611863576118508160016112d8565b15611863578161185f81612a51565b9250505b8261186d81612a51565b93505060005a9050808511156118945761189161188a8683611d80565b879061193e565b95505b93506117d29050565b600e85905590975095509193505050505b9193909250565b6000826000036118c757506000610baa565b60006118d38385612a80565b9050826118e085836129c0565b146119375760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c9c565b9392505050565b60008061194b8385612a97565b9050838110156119375760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b6044820152606401610c9c565b6001600160a01b0383166119fd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c9c565b6001600160a01b038216611a5e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c9c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602f60248201527f52756666527566665f4469766964656e645f547261636b65723a204e6f20747260448201526e185b9cd9995c9cc8185b1b1bddd959608a1b6064820152608401610c9c565b505050565b60008184841115611b485760405162461bcd60e51b8152600401610c9c91906127fb565b506000611b558486612aaa565b95945050505050565b60008181811215610baa57600080fd5b600080611b7b8385612abd565b905060008312158015611b8e5750838112155b80611ba35750600083128015611ba357508381125b61193757600080fd5b600080821215611bbb57600080fd5b5090565b6000611bca836110a3565b905080821115611bf2576000611be08383611d80565b9050611bec8482612594565b50505050565b80821015611b1f576000611c068284611d80565b9050611bec84826125f8565b6001600160a01b038116600090815260038301602052604090205460ff16611c38575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611c8291612aaa565b90506000846000018281548110611c9b57611c9b612a6a565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611cea57611cea612a6a565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611d2457611d24612ae5565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611d6457611d64612a6a565b6000918252602090912001546001600160a01b03169392505050565b600061193783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b24565b600080611dce836111fe565b905080156120cc576001600160a01b038316600090815260076020526040902054611df9908261193e565b6001600160a01b0380851660009081526007602090815260408083209490945560129052918220546014549116919060ff161580611e3e57506001600160a01b038216155b80611e6257506001600160a01b03821660009081526013602052604090205460ff16155b15611ec5576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611eb5576040519150601f19603f3d011682016040523d82523d6000602084013e611eba565b606091505b505080915050612032565b604080516002808252606082018352600092602083019080368337019050509050601460039054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5d9190612afb565b81600081518110611f7057611f70612a6a565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611fa457611fa4612a6a565b6001600160a01b03928316602091820292909201015260145460405163b6f9de9560e01b815263010000009091049091169063b6f9de95908690611ff39060009086908c904290600401612b5c565b6000604051808303818588803b15801561200c57600080fd5b505af19350505050801561201e575060015b61202b5760009150612030565b600191505b505b80612080576001600160a01b03851660009081526007602052604090205461205a9084611d80565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d846040516120bb91815260200190565b60405180910390a250909392505050565b50600092915050565b6000806120e1836111fe565b905080156120cc576001600160a01b03831660009081526007602052604081205461210c908361193e565b6001600160a01b0385166000908152600760205260408082209290925581516002808252606082019093529091816020016020820280368337019050509050601460039054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561219e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c29190612afb565b816000815181106121d5576121d5612a6a565b6001600160a01b03928316602091820292909201015260155482519116908290600190811061220657612206612a6a565b6001600160a01b0392831660209182029290920101526015546040516370a0823160e01b815260009291909116906370a082319061224890309060040161288d565b602060405180830381865afa158015612265573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122899190612b91565b60145460405163b6f9de9560e01b8152919250630100000090046001600160a01b03169063b6f9de959086906122ca90600090879030904290600401612b5c565b6000604051808303818588803b1580156122e357600080fd5b505af1935050505080156122f5575060015b612302576000925061240a565b6015546040516370a0823160e01b815260009161237a9184916001600160a01b0316906370a082319061233990309060040161288d565b602060405180830381865afa158015612356573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112249190612b91565b905080156124035760155460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af11580156123d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fd9190612baa565b50612408565b600093505b505b82612459576001600160a01b0386166000908152600760205260409020546124329085611d80565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff16156124a8576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff166125375750600019610baa565b506001600160a01b03166000908152600291909101602052604090205490565b6000806125648385612bc7565b9050600083121580156125775750838113155b80611ba35750600083128015611ba3575083811361193757600080fd5b61259e828261263c565b6125d86125b9610c58836005546118b590919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490612557565b6001600160a01b0390921660009081526006602052604090209190915550565b6126028282612709565b6125d861261d610c58836005546118b590919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611b6e565b6001600160a01b0382166126925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c9c565b60025461269f908261193e565b6002556001600160a01b0382166000908152602081905260409020546126c5908261193e565b6001600160a01b03831660008181526020818152604080832094909455925184815291929091600080516020612c3983398151915291015b60405180910390a35050565b6001600160a01b0382166127695760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c9c565b6127a681604051806060016040528060228152602001612bef602291396001600160a01b0385166000908152602081905260409020549190611b24565b6001600160a01b0383166000908152602081905260409020556002546127cc9082611d80565b6002556040518181526000906001600160a01b03841690600080516020612c39833981519152906020016126fd565b600060208083528351808285015260005b818110156128285785810183015185820160400152820161280c565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461285e57600080fd5b50565b6000806040838503121561287457600080fd5b823561287f81612849565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000602082840312156128b357600080fd5b813561193781612849565b6000806000606084860312156128d357600080fd5b83356128de81612849565b925060208401356128ee81612849565b929592945050506040919091013590565b801515811461285e57600080fd5b60006020828403121561291f57600080fd5b8135611937816128ff565b6000806040838503121561293d57600080fd5b823561294881612849565b91506020830135612958816128ff565b809150509250929050565b60006020828403121561297557600080fd5b5035919050565b6000806040838503121561298f57600080fd5b823561299a81612849565b9150602083013561295881612849565b634e487b7160e01b600052601160045260246000fd5b6000826129dd57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806129f657607f821691505b602082108103612a1657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060018201612a6357612a636129aa565b5060010190565b634e487b7160e01b600052603260045260246000fd5b8082028115828204841417610baa57610baa6129aa565b80820180821115610baa57610baa6129aa565b81810381811115610baa57610baa6129aa565b8082018281126000831280158216821582161715612add57612add6129aa565b505092915050565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612b0d57600080fd5b815161193781612849565b600081518084526020808501945080840160005b83811015612b515781516001600160a01b031687529582019590820190600101612b2c565b509495945050505050565b848152608060208201526000612b756080830186612b18565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612ba357600080fd5b5051919050565b600060208284031215612bbc57600080fd5b8151611937816128ff565b8181036000831280158383131683831282161715612be757612be76129aa565b509291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122015da9bcc46c75c387f654715b906891747ede8f0f6650aa4fd27943d6ff528fa64736f6c63430008120033
Deployed Bytecode
0x6080604052600436106105655760003560e01c8063871c128d116102c1578063871c128d14610db657806388a9d55414610dd657806388bdd9be14610deb5780638a8c523c14610e0b5780638da5cb5b14610e205780638f3fa86014610e35578063906e9dd014610e4b578063913c7df614610e6b57806395d89b4114610e9857806398118cb414610ead5780639a7a23d614610ec35780639b45900814610ee35780639c1b8af514610efe5780639c3372ea14610f145780639d325abd14610f34578063a18a7bfc14610f49578063a3e1096e14610f69578063a3ec8c8914610f7f578063a457c2d714610f9a578063a5ece94114610fba578063a8b9d24014610fda578063a9059cbb14610ffa578063ad56c13c1461101a578063ad8e749514611071578063b62496f51461109e578063b8429e05146110ce578063ba079d49146110e8578063bc7f25e414611108578063befa65aa14611128578063c02466681461113e578063c07b528a1461115e578063c32c293d1461118b578063c64e5aa0146111ab578063ce7d83f6146111c1578063d07a091c146111e1578063d35e3cd014611201578063d37e095214611217578063d46980161461122d578063d564af3a1461124d578063d5a1b7191461126d578063d5e37251146112dc578063d8032ed3146112fc578063db74559b1461131c578063dd62ed3e14611349578063e2f456051461138f578063e37ba8f9146113a5578063e409bfad146113c5578063e718ae92146113db578063e7300d3b146113fb578063e76e98621461141b578063e7841ec014611431578063ea1644d514611446578063ea2290ba14611466578063ec0d3fb114611486578063f1c0ddff1461149c578063f27fd254146114c9578063f2fde38b146114e9578063f5d3c79a14611509578063f94ce0d214611529578063fa95619614611549578063fb0b8dc01461156957600080fd5b806301abc132146105715780630224e9a71461059357806306fdde03146105bc57806309239b2b146105de578063095ea7b3146105fe5780630ef35b7e1461062e57806313616b4a1461064e5780631694505e1461066e57806318160ddd1461069b57806318ad81f8146106b05780631a676afa146106f15780631e093e941461071157806323b872dd1461073a57806324acbd691461075a5780632a84ff51146107905780632c1f5216146107d357806330bb4cff146107f3578063313ce567146108085780633599bb171461082457806337e84502146108445780633944784d1461086457806339509351146108885780633c295986146108a857806340ffdd80146108be578063435c89e4146108de57806343e716fe1461090b578063446d49da1461092b578063457ffca2146109415780634625830e1461096157806346585f741461098157806349bd5a5e146109975780634a74bb02146109b75780634ad12ec0146109d15780634ada218b146109e75780634e71d92d14610a085780634fbee19314610a1d57806350a0ccac14610a565780635123425b14610a6c5780635424226d14610a8c578063551e5f8d14610ab95780635764b7c414610ad95780635b72c18c14610b0f5780635e52a00b14610b2f5780635eb402a414610b655780636094c4ce14610b9257806363b4bc5314610bbf57806364b0f65314610bdf57806365b8dbc014610bf45780636843cd8414610c145780636d48467b14610c345780636e94729814610c54578063700bb19114610c6757806370a0823114610c875780637b0bbe9714610ca75780637b1a490914610cbd5780637d32f34214610cdd578063838a538614610d0a578063847ff70214610d2a57806384ae2bc614610d4a57806385e12a9414610d60578063868730c714610d9657600080fd5b3661056c57005b600080fd5b34801561057d57600080fd5b5061059161058c3660046151f4565b61157f565b005b34801561059f57600080fd5b506105a9600f5481565b6040519081526020015b60405180910390f35b3480156105c857600080fd5b506105d16116f6565b6040516105b39190615226565b3480156105ea57600080fd5b506105a96105f9366004615289565b611788565b34801561060a57600080fd5b5061061e6106193660046152a6565b6117a3565b60405190151581526020016105b3565b34801561063a57600080fd5b506105916106493660046152d2565b6117ba565b34801561065a57600080fd5b506105916106693660046152f4565b6118ad565b34801561067a57600080fd5b5060065461068e906001600160a01b031681565b6040516105b39190615336565b3480156106a757600080fd5b506002546105a9565b3480156106bc57600080fd5b5061068e6106cb3660046152a6565b601a6020908152600092835260408084209091529082529020546001600160a01b031681565b3480156106fd57600080fd5b5061059161070c36600461534a565b611912565b34801561071d57600080fd5b50602c54602d54602e54602f546040516105b39493929190615376565b34801561074657600080fd5b5061061e610755366004615391565b611954565b34801561076657600080fd5b506105a9610775366004615289565b6001600160a01b031660009081526024602052604090205490565b34801561079c57600080fd5b5061068e6107ab3660046152a6565b6001600160a01b039182166000908152601a6020908152604080832093835292905220541690565b3480156107df57600080fd5b5060085461068e906001600160a01b031681565b3480156107ff57600080fd5b506105a96119bd565b34801561081457600080fd5b50604051600981526020016105b3565b34801561083057600080fd5b5061059161083f3660046153e0565b611a30565b34801561085057600080fd5b5061059161085f3660046152d2565b611abd565b34801561087057600080fd5b50610879611b3e565b6040516105b3939291906153fd565b34801561089457600080fd5b5061061e6108a33660046152a6565b611b89565b3480156108b457600080fd5b506105a9600e5481565b3480156108ca57600080fd5b506105916108d93660046153e0565b611bbf565b3480156108ea57600080fd5b506105a96108f9366004615413565b60396020526000908152604090205481565b34801561091757600080fd5b50610591610926366004615413565b611c1a565b34801561093757600080fd5b506105a960295481565b34801561094d57600080fd5b5061059161095c36600461542c565b611c6d565b34801561096d57600080fd5b5061059161097c366004615413565b611d07565b34801561098d57600080fd5b506105a960315481565b3480156109a357600080fd5b5060075461068e906001600160a01b031681565b3480156109c357600080fd5b5060335461061e9060ff1681565b3480156109dd57600080fd5b506105a960305481565b3480156109f357600080fd5b5060075461061e90600160b01b900460ff1681565b348015610a1457600080fd5b50610591611d4d565b348015610a2957600080fd5b5061061e610a38366004615289565b6001600160a01b031660009081526035602052604090205460ff1690565b348015610a6257600080fd5b506105a960125481565b348015610a7857600080fd5b50610591610a87366004615467565b611dc6565b348015610a9857600080fd5b506105a9610aa7366004615289565b60276020526000908152604090205481565b348015610ac557600080fd5b50610591610ad4366004615413565b611edd565b348015610ae557600080fd5b506105a9610af4366004615289565b6001600160a01b031660009081526026602052604090205490565b348015610b1b57600080fd5b5061061e610b2a366004615289565b611f23565b348015610b3b57600080fd5b50336000908152601a602090815260408083208380529091529020546001600160a01b031661068e565b348015610b7157600080fd5b506105a9610b80366004615413565b60226020526000908152604090205481565b348015610b9e57600080fd5b506105a9610bad366004615289565b60256020526000908152604090205481565b348015610bcb57600080fd5b50610591610bda3660046152f4565b611f95565b348015610beb57600080fd5b506105a961208b565b348015610c0057600080fd5b50610591610c0f366004615289565b6120d5565b348015610c2057600080fd5b506105a9610c2f366004615289565b61219c565b348015610c4057600080fd5b5061061e610c4f366004615289565b61220e565b348015610c6057600080fd5b50476105a9565b348015610c7357600080fd5b50610591610c82366004615413565b61223f565b348015610c9357600080fd5b506105a9610ca2366004615289565b6122fb565b348015610cb357600080fd5b506105a9601d5481565b348015610cc957600080fd5b50610591610cd83660046152a6565b612316565b348015610ce957600080fd5b506105a9610cf8366004615289565b60386020526000908152604090205481565b348015610d1657600080fd5b50610591610d2536600461534a565b612376565b348015610d3657600080fd5b50610591610d45366004615289565b6123ae565b348015610d5657600080fd5b506105a960215481565b348015610d6c57600080fd5b506105a9610d7b366004615289565b6001600160a01b031660009081526025602052604090205490565b348015610da257600080fd5b50610591610db13660046153e0565b6123fa565b348015610dc257600080fd5b50610591610dd1366004615413565b61242c565b348015610de257600080fd5b506105a96124d5565b348015610df757600080fd5b50610591610e06366004615289565b6124e0565b348015610e1757600080fd5b5061059161278b565b348015610e2c57600080fd5b5061068e61282f565b348015610e4157600080fd5b506105a9600c5481565b348015610e5757600080fd5b50610591610e66366004615289565b61283e565b348015610e7757600080fd5b506105a9610e86366004615413565b60009081526022602052604090205490565b348015610ea457600080fd5b506105d161288a565b348015610eb957600080fd5b506105a960115481565b348015610ecf57600080fd5b50610591610ede366004615467565b612899565b348015610eef57600080fd5b50601954601754601854610879565b348015610f0a57600080fd5b506105a960345481565b348015610f2057600080fd5b50610591610f2f3660046153e0565b6128ec565b348015610f4057600080fd5b506023546105a9565b348015610f5557600080fd5b50610591610f64366004615289565b612948565b348015610f7557600080fd5b506105a960105481565b348015610f8b57600080fd5b50603054603154603254610879565b348015610fa657600080fd5b5061061e610fb53660046152a6565b612be6565b348015610fc657600080fd5b50600a5461068e906001600160a01b031681565b348015610fe657600080fd5b506105a9610ff5366004615289565b612c35565b34801561100657600080fd5b5061061e6110153660046152a6565b612c66565b34801561102657600080fd5b5061103a611035366004615289565b612c73565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c0016105b3565b34801561107d57600080fd5b506105a961108c366004615289565b60286020526000908152604090205481565b3480156110aa57600080fd5b5061061e6110b9366004615289565b60366020526000908152604090205460ff1681565b3480156110da57600080fd5b5060205461061e9060ff1681565b3480156110f457600080fd5b5061061e611103366004615289565b612d05565b34801561111457600080fd5b5061068e611123366004615289565b612d36565b34801561113457600080fd5b506105a960135481565b34801561114a57600080fd5b50610591611159366004615467565b612d5f565b34801561116a57600080fd5b506105a9611179366004615289565b60266020526000908152604090205481565b34801561119757600080fd5b5061068e6111a6366004615289565b612e15565b3480156111b757600080fd5b506105a960155481565b3480156111cd57600080fd5b506105a96111dc366004615289565b612e87565b3480156111ed57600080fd5b506105916111fc366004615289565b612ee1565b34801561120d57600080fd5b506105a9602a5481565b34801561122357600080fd5b506105a9601e5481565b34801561123957600080fd5b5060095461068e906001600160a01b031681565b34801561125957600080fd5b50610591611268366004615413565b612f6f565b34801561127957600080fd5b506112b7611288366004615413565b6000908152601f6020908152604080832054601e546001600160a01b03909116808552601c9093529220549092565b604080516001600160a01b0390941684526020840192909252908201526060016105b3565b3480156112e857600080fd5b506105916112f73660046153e0565b613023565b34801561130857600080fd5b50610591611317366004615289565b6130ac565b34801561132857600080fd5b506105a9611337366004615289565b60246020526000908152604090205481565b34801561135557600080fd5b506105a96113643660046154a0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561139b57600080fd5b506105a9600d5481565b3480156113b157600080fd5b506105916113c0366004615289565b6131e2565b3480156113d157600080fd5b506105a960325481565b3480156113e757600080fd5b506105916113f63660046153e0565b613274565b34801561140757600080fd5b506105916114163660046151f4565b6132fe565b34801561142757600080fd5b506105a960165481565b34801561143d57600080fd5b506105a961333c565b34801561145257600080fd5b50610591611461366004615413565b613386565b34801561147257600080fd5b50600b5461068e906001600160a01b031681565b34801561149257600080fd5b506105a9602b5481565b3480156114a857600080fd5b506105a96114b7366004615289565b60376020526000908152604090205481565b3480156114d557600080fd5b5061103a6114e4366004615413565b6133b5565b3480156114f557600080fd5b50610591611504366004615289565b6133f3565b34801561151557600080fd5b506105916115243660046153e0565b6134de565b34801561153557600080fd5b5061061e611544366004615289565b613510565b34801561155557600080fd5b50610591611564366004615413565b61352e565b34801561157557600080fd5b506105a960145481565b6005546001600160a01b031633146115b25760405162461bcd60e51b81526004016115a9906154ce565b60405180910390fd5b60028211156115d35760405162461bcd60e51b81526004016115a990615503565b60028111156115f45760405162461bcd60e51b81526004016115a990615503565b600a8411156116435760405162461bcd60e51b815260206004820152601b60248201527a43616e6e6f74207365742064657620666565206f7665722031302560281b60448201526064016115a9565b600a83111561169e5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f7420736574206c697175696469747920666565206f7665722031306044820152602560f81b60648201526084016115a9565b60108490556012839055601482905560168190556040517f7930d77b0ffd67679071b576440d6e525f442ff3f55db20413eed41d88c81583906116e8908690869086908690615376565b60405180910390a150505050565b60606003805461170590615538565b80601f016020809104026020016040519081016040528092919081815260200182805461173190615538565b801561177e5780601f106117535761010080835404028352916020019161177e565b820191906000526020600020905b81548152906001019060200180831161176157829003601f168201915b5050505050905090565b6001600160a01b03166000908152601c602052604090205490565b60006117b03384846135c9565b5060015b92915050565b6005546001600160a01b031633146117e45760405162461bcd60e51b81526004016115a9906154ce565b6000828152603960205260409020548190036117ff57600080fd5b60648111156118505760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e27742065786365656420313030000060448201526064016115a9565b6000811161189b5760405162461bcd60e51b815260206004820152601860248201527705374616b696e6720626f6e75732063616e277420626520360441b60448201526064016115a9565b60009182526039602052604090912055565b6005546001600160a01b031633146118d75760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b039283166000908152601a602090815260408083209483529390529190912080546001600160a01b03191691909216179055565b6005546001600160a01b0316331461193c5760405162461bcd60e51b81526004016115a9906154ce565b611945816136ee565b61194f83836137db565b505050565b6000611961848484613aaa565b6119b384336119ae856040518060600160405280602881526020016159fd602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614461565b6135c9565b5060019392505050565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2b9190615572565b905090565b6005546001600160a01b03163314611a5a5760405162461bcd60e51b81526004016115a9906154ce565b600854604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b158015611aa257600080fd5b505af1158015611ab6573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314611ae75760405162461bcd60e51b81526004016115a9906154ce565b6000828152602260205260409020819055611b0061449b565b60408051838152602081018390527fbfe4066ad4b56591d9738665ba86b038826d6ec196bd3e4c2305847c22eb02a891015b60405180910390a15050565b600554600090819081906001600160a01b03163314611b6f5760405162461bcd60e51b81526004016115a9906154ce565b611b776144e8565b50506030546031546032549193909250565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916117b09185906119ae9086613565565b6005546001600160a01b03163314611be95760405162461bcd60e51b81526004016115a9906154ce565b6008546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd8090602401611a88565b6005546001600160a01b03163314611c445760405162461bcd60e51b81526004016115a9906154ce565b6301312d00811115611c685760405162461bcd60e51b81526004016115a99061558b565b600d55565b6005546001600160a01b03163314611c975760405162461bcd60e51b81526004016115a9906154ce565b600f8590556011849055601383905560158290556021819055604080518681526020810186905290810184905260608101839052608081018290527fda70e0b1954bcd95873c930c54e19a24ff3b2f024251a9eb0756e67a7794711e9060a0015b60405180910390a15050505050565b6005546001600160a01b03163314611d315760405162461bcd60e51b81526004016115a9906154ce565b600754600160b01b900460ff1615611d4857600080fd5b604455565b60085460405163bc4c4b3760e01b81526001600160a01b039091169063bc4c4b3790611d809033906000906004016155d2565b6020604051808303816000875af1158015611d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc391906155ed565b50565b6005546001600160a01b03163314611df05760405162461bcd60e51b81526004016115a9906154ce565b306001600160a01b03831603611e485760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420757365206e617469766520746f6b656e20616464726573730060448201526064016115a9565b600854604051635123425b60e01b81526001600160a01b0390911690635123425b90611e7a90859085906004016155d2565b600060405180830381600087803b158015611e9457600080fd5b505af1158015611ea8573d6000803e3d6000fd5b505050507ff8e5e8c18b9fbb7607019e8dab60e0ad981ba259df038a668fc13025a64854d68282604051611b329291906155d2565b6005546001600160a01b03163314611f075760405162461bcd60e51b81526004016115a9906154ce565b600754600160b01b900460ff1615611f1e57600080fd5b604355565b6008546040516316dcb06360e21b81526000916001600160a01b031690635b72c18c90611f54908590600401615336565b602060405180830381865afa158015611f71573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b491906155ed565b6005546001600160a01b03163314611fbf5760405162461bcd60e51b81526004016115a9906154ce565b306001600160a01b038416036120145760405162461bcd60e51b815260206004820152601a60248201527921b0b73737ba103932b6b7bb32903730ba34bb32903a37b5b2b760311b60448201526064016115a9565b60405163a9059cbb60e01b81526001600160a01b0384169063a9059cbb90612042908490869060040161560a565b6020604051808303816000875af1158015612061573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208591906155ed565b50505050565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611a07573d6000803e3d6000fd5b6005546001600160a01b031633146120ff5760405162461bcd60e51b81526004016115a9906154ce565b6006546001600160a01b039081169082160361211a57600080fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0383811691909117909155600854604051630196e36f60e61b81529116906365b8dbc090611a88908490600401615336565b6008546040516370a0823160e01b81526000916001600160a01b0316906370a08231906121cd908590600401615336565b602060405180830381865afa1580156121ea573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b49190615572565b600854604051636d48467b60e01b81526000916001600160a01b031690636d48467b90611f54908590600401615336565b6008546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015612292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b69190615623565b925092509250326001600160a01b031660001515600080516020615957833981519152858585896040516122ed9493929190615376565b60405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146123405760405162461bcd60e51b81526004016115a9906154ce565b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561194f573d6000803e3d6000fd5b6005546001600160a01b031633146123a05760405162461bcd60e51b81526004016115a9906154ce565b603092909255603155603255565b6005546001600160a01b031633146123d85760405162461bcd60e51b81526004016115a9906154ce565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051638bc1d63960e01b81526001600160a01b0390911690638bc1d63990611a8890339085906004016155d2565b6005546001600160a01b031633146124565760405162461bcd60e51b81526004016115a9906154ce565b62030d40811015801561246c57506207a1208111155b6124d05760405162461bcd60e51b815260206004820152602f60248201527f6e6577206761732076616c7565206d757374206265206265747765656e20323060448201526e03030303020616e642035303030303608c1b60648201526084016115a9565b603455565b6000611a2b306122fb565b6005546001600160a01b0316331461250a5760405162461bcd60e51b81526004016115a9906154ce565b6008546001600160a01b039081169082160361252557600080fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612572573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125969190615651565b6001600160a01b0316146125a957600080fd5b60405163031e79db60e41b81526001600160a01b038216906331e79db0906125d5908490600401615336565b600060405180830381600087803b1580156125ef57600080fd5b505af1158015612603573d6000803e3d6000fd5b505060405163031e79db60e41b81526001600160a01b03841692506331e79db09150612633903090600401615336565b600060405180830381600087803b15801561264d57600080fd5b505af1158015612661573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db061267c61282f565b6040518263ffffffff1660e01b81526004016126989190615336565b600060405180830381600087803b1580156126b257600080fd5b505af11580156126c6573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b0380861694506331e79db093506126fa921690600401615336565b600060405180830381600087803b15801561271457600080fd5b505af1158015612728573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b031633146127b55760405162461bcd60e51b81526004016115a9906154ce565b600754600160b01b900460ff16156128095760405162461bcd60e51b81526020600482015260176024820152761d1c98591a5b99c8185b1c9958591e48195b98589b1959604a1b60448201526064016115a9565b6007805460ff60b01b1916600160b01b1790556020805460ff1916600117905543604255565b6005546001600160a01b031690565b6005546001600160a01b031633146128685760405162461bcd60e51b81526004016115a9906154ce565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60606004805461170590615538565b6005546001600160a01b031633146128c35760405162461bcd60e51b81526004016115a9906154ce565b6007546001600160a01b03908116908316036128de57600080fd5b6128e88282614620565b5050565b6005546001600160a01b031633146129165760405162461bcd60e51b81526004016115a9906154ce565b600854604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea90602401611a88565b6001600160a01b0381166129955760405162461bcd60e51b81526020600482015260146024820152732737ba1030903b30b634b2103932b332b93932b960611b60448201526064016115a9565b336001600160a01b038216036129e95760405162461bcd60e51b81526020600482015260196024820152782cb7ba9031b0b73737ba103932b332b9103cb7bab939b2b63360391b60448201526064016115a9565b336000908152601a602090815260408083208380529091529020546001600160a01b031615612a585760405162461bcd60e51b815260206004820152601b60248201527a52656665727265722063616e6e6f74206265206368616e6765642160281b60448201526064016115a9565b336000908152601a60209081526040808320838052825280832080546001600160a01b0319166001600160a01b03861690811790915583526024909152902054612aa3906001615684565b6001600160a01b0382166000908152602460205260408120919091555b6001602354612acf9190615697565b811215612b96576001600160a01b038083166000908152601a602090815260408083208584529091529020541680612b075750612b96565b336000908152601a602052604081208291612b238560016156be565b81526020808201929092526040908101600090812080546001600160a01b0319166001600160a01b0395861617905592841683526025909152902054612b6a906001615684565b6001600160a01b0390911660009081526025602052604090205580612b8e816156e6565b915050612ac0565b50602d54602e54602f5460405133936001600160a01b038616937f2311833a6b34f4f41fdf892d645b68a6ccfeaec5f489c18070af21710258577193612bdb936153fd565b60405180910390a350565b60006117b033846119ae85604051806060016040528060258152602001615a45602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614461565b6008546040516302a2e74960e61b81526000916001600160a01b03169063a8b9d240906121cd908590600401615336565b60006117b0338484613aaa565b60085460405163fbcbc0f160e01b8152600091829182918291829182916001600160a01b039091169063fbcbc0f190612cb0908a90600401615336565b60c060405180830381865afa158015612ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cf19190615705565b949c939b5091995097509550909350915050565b60085460405163ba079d4960e01b81526000916001600160a01b03169063ba079d4990611f54908590600401615336565b6001600160a01b039081166000908152601a602090815260408083208380529091529020541690565b6005546001600160a01b03163314612d895760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b03821660009081526035602052604090205481151560ff909116151503612db657600080fd5b6001600160a01b038216600081815260356020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b60085460405163c32c293d60e01b81526000916001600160a01b03169063c32c293d90612e46908590600401615336565b602060405180830381865afa158015612e63573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b49190615651565b6000805b602354811215612ed7576001600160a01b038381166000908152601a6020908152604080832085845290915290205416612ec55792915050565b80612ecf816156e6565b915050612e8b565b5060001992915050565b6005546001600160a01b03163314612f0b5760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b038181166000908152603a602090815260408083208054600160ff19918216811790925560359093529281902080549092169092179055600854905163031e79db60e41b81529116906331e79db090611a88908490600401615336565b6005546001600160a01b03163314612f995760405162461bcd60e51b81526004016115a9906154ce565b600d548111612ffa5760405162461bcd60e51b815260206004820152602760248201527f4d617820616d6f756e74206d7573742062652067726561746572207468616e206044820152666d696e696d756d60c81b60648201526084016115a9565b6301312d0081111561301e5760405162461bcd60e51b81526004016115a99061558b565b600e55565b6005546001600160a01b0316331461304d5760405162461bcd60e51b81526004016115a9906154ce565b60335481151560ff90911615150361306457600080fd5b6033805460ff19168215159081179091556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef906020015b60405180910390a150565b60006130b7336122fb565b116131385760405162461bcd60e51b815260206004820152604560248201527f596f75206d757374206f776e206d6f7265207468616e207a65726f202452554660448201527f4620746f6b656e7320746f2073776974636820796f7572207061796f757420746064820152646f6b656e2160d81b608482015260a4016115a9565b306001600160a01b0382160361314d57600080fd5b60085460405163f7dd53a960e01b81526001600160a01b039091169063f7dd53a99061317f9033908590600401615758565b600060405180830381600087803b15801561319957600080fd5b505af11580156131ad573d6000803e3d6000fd5b505050507f3640c981ed7cfa9e689ac4e9cafffd8c9240b716b14c982b3e90d54e7b61de2433826040516130a1929190615758565b6005546001600160a01b0316331461320c5760405162461bcd60e51b81526004016115a9906154ce565b613217816001612d5f565b6009546040516001600160a01b03918216918316907f6080503d1da552ae8eb4b7b8a20245d9fabed014180510e7d1a05ea08fdb0f3e90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b60205460ff166132de5760405162461bcd60e51b815260206004820152602f60248201527f436f6e76657274696e6720726566657272616c2072657761726473206973206e60448201526e6f7420656e61626c6564207965742160881b60648201526084016115a9565b336000908152601b60205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146133285760405162461bcd60e51b81526004016115a9906154ce565b602c93909355602d91909155602e55602f55565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611a07573d6000803e3d6000fd5b6005546001600160a01b031633146133b05760405162461bcd60e51b81526004016115a9906154ce565b600c55565b600854604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612cb0565b6005546001600160a01b0316331461341d5760405162461bcd60e51b81526004016115a9906154ce565b6001600160a01b0381166134825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016115a9565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051632c8be28160e21b81526001600160a01b039091169063b22f8a0490611a8890339085906004016155d2565b6001600160a01b03166000908152601b602052604090205460ff1690565b6005546001600160a01b031633146135585760405162461bcd60e51b81526004016115a9906154ce565b6023819055611dc361449b565b6000806135728385615684565b9050838110156135c25760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b60448201526064016115a9565b9392505050565b6001600160a01b03831661362b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016115a9565b6001600160a01b03821661368c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016115a9565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6136f7306122fb565b811115613723576000805160206159978339815191526000806000806040516130a19493929190615772565b600e548111156137325750600e545b600061373f8260026146ec565b9050600061374d838361472b565b905081158061375a575080155b1561376457505050565b4761376f833061476d565b8260186000828254613781919061578f565b9091555060009050613793478361472b565b905061379f83826148f0565b82601860008282546137b1919061578f565b909155505060405160008051602061599783398151915290611cf890869084908790600190615772565b6137e4306122fb565b6137ee8284615684565b1115613816576000805160206159dd83398151915282826000604051611b32939291906157a2565b600080600e5484111561382957600e5493505b479150613836843061476d565b613840824761578f565b90508360196000828254613854919061578f565b9091555081905084613864575060005b6008546040516000916001600160a01b03169083908381818185875af1925050503d80600081146138b1576040519150601f19603f3d011682016040523d82523d6000602084013e6138b6565b606091505b50509050600e548511156138ca57600e5494505b4793506138d7853061476d565b6138e1844761578f565b925084601760008282546138f5919061578f565b9091555083905085613905575060005b60006139126002836157ba565b600a546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114613964576040519150601f19603f3d011682016040523d82523d6000602084013e613969565b606091505b50509050806139ba5760405162461bcd60e51b815260206004820152601e60248201527f53656e64696e6720424e4220746f2077616c6c65742031206661696c6564000060448201526064016115a9565b600b546040516000916001600160a01b03169084908381818185875af1925050503d8060008114613a07576040519150601f19603f3d011682016040523d82523d6000602084013e613a0c565b606091505b5050905080613a5d5760405162461bcd60e51b815260206004820152601e60248201527f53656e64696e6720424e4220746f2077616c6c65742032206661696c6564000060448201526064016115a9565b6000828015613a695750815b90506000805160206159dd8339815191528786888015613a865750835b604051613a95939291906157a2565b60405180910390a15050505050505050505050565b6001600160a01b038316613ad05760405162461bcd60e51b81526004016115a9906157dc565b600754600160b01b900460ff1680613b0057506001600160a01b0383166000908152603a602052604090205460ff165b613b4c5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c656460448201526064016115a9565b6007546001600160a01b03848116911614613bd157306001600160a01b03831603613bd15760405162461bcd60e51b815260206004820152602f60248201527f596f752063616e6e6f742073656e6420746f6b656e7320746f2074686520636f60448201526e6e747261637420616464726573732160881b60648201526084016115a9565b80600003613be55761194f8383600061499d565b600754600160a01b900460ff16158015613c1857506001600160a01b03831660009081526035602052604090205460ff16155b8015613c3d57506001600160a01b03821660009081526035602052604090205460ff16155b8015613c6d57506007546001600160a01b0383811691161480613c6d57506007546001600160a01b038481169116145b15614378576001600160a01b038216600090815260366020526040812054600f54603c55601154603d55601354603e55601554603f5560ff16908080613cb286612d36565b6001600160a01b031614158015613cc7575082155b15613cf45760019150613cd985612d36565b601054600f5560125460115560145460135560165460155590505b604354604254613d049190615684565b431015613d2157604454600f556000601181905560138190556015555b6007546001600160a01b03868116911614613da657600c5484613d43876122fb565b613d4d9190615684565b10613da65760405162461bcd60e51b815260206004820152602360248201527f544f4b454e3a2042616c616e636520657863656564732077616c6c65742073696044820152627a652160e81b60648201526084016115a9565b6000613db1306122fb565b90506000601e54118015613dc7575060205460ff165b8015613dd05750835b15613e5657601d546000908152601f6020526040812054613df9906001600160a01b0316611788565b905060008111613e1d57601d8054906000613e1383615821565b9190505550613e54565b600e54811115613e2c5750600e545b601d546000908152601f6020526040902054613e5490899083906001600160a01b0316614ae2565b505b600d5481108015908190613e8357506001600160a01b03881660009081526036602052604090205460ff16155b15613ecd576007805460ff60a01b1916600160a01b17905560335460ff1615613eb157613eb16018546136ee565b613ebf6019546017546137db565b6007805460ff60a01b191690555b85603b819055506000613ef66064613ef06021548a61507a90919063ffffffff16565b906146ec565b905084156141845760005b602354811215614149576001600160a01b03808a166000908152601a602090815260408083208584528252808320546022909252822054603b549190931692613f529161271091613ef0919061507a565b90506001600160a01b038216613f69575050614149565b613f738a8261472b565b9950613f7e82613510565b1580613f8d575060205460ff16155b156140a057613f9d8c838361499d565b6008546001600160a01b031663e30443bc83613fb8816150fc565b6040518363ffffffff1660e01b8152600401613fd592919061560a565b600060405180830381600087803b158015613fef57600080fd5b505af1158015614003573d6000803e3d6000fd5b505050506001600160a01b0382166000908152602660205260408120805483929061402f908490615684565b9250508190555080602960008282546140489190615684565b909155506140589050818561578f565b935060001981836001600160a01b0316600080516020615a258339815191528f602d54602e54602f548a604051614093959493929190615833565b60405180910390a4614134565b6140ab8c308361499d565b60006140b683611788565b116140f957601e80546000908152601f6020526040812080546001600160a01b0319166001600160a01b038616179055815491906140f383615821565b91905055505b6001600160a01b0382166000908152601c602052604081208054839290614121908490615684565b909155506141319050818561578f565b93505b50508080614141906156e6565b915050613f01565b50801561417f5761415a878261472b565b965061416789308361499d565b80601960008282546141799190615684565b90915550505b6141b8565b856141b857614193878261472b565b96506141a089308361499d565b80601960008282546141b29190615684565b90915550505b6000866141c7576013546141cb565b6015545b905060006141eb6064613ef0600f54603b5461507a90919063ffffffff16565b9050600061420b6064613ef0601154603b5461507a90919063ffffffff16565b905060006142296064613ef086603b5461507a90919063ffffffff16565b9050826017600082825461423d9190615684565b9250508190555081601860008282546142569190615684565b92505081905550806019600082825461426f9190615684565b9091555060009050816142828486615684565b61428c9190615684565b90506142988c8261472b565b9b506142a58e308361499d565b6034546008546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015614312575060408051601f3d908101601f1916820190925261430f91810190615623565b60015b1561434c57604051329060019060008051602061595783398151915290614340908790879087908b90615376565b60405180910390a35050505b8a1561436b57603c54600f55603d54601155603e54601355603f546015555b5050505050505050505050505b61438383838361499d565b6008546001600160a01b031663e30443bc8461439e816150fc565b6040518363ffffffff1660e01b81526004016143bb92919061560a565b600060405180830381600087803b1580156143d557600080fd5b505af11580156143e9573d6000803e3d6000fd5b50506008546001600160a01b0316915063e30443bc90508361440a816150fc565b6040518363ffffffff1660e01b815260040161442792919061560a565b600060405180830381600087803b15801561444157600080fd5b505af1158015614455573d6000803e3d6000fd5b5050505061194f6144e8565b600081848411156144855760405162461bcd60e51b81526004016115a99190615226565b506000614492848661578f565b95945050505050565b6000805b6023548112156144d6576000818152602260205260409020546144c29083615684565b9150806144ce816156e6565b91505061449f565b506144e26064826157ba565b60215550565b603054421061454e57602d805490600061450183615821565b90915550614513905042612198615684565b603055602d546000805160206159778339815191529060019061453790829061578f565b604051614545929190615861565b60405180910390a15b60315442106145b657602e805490600061456783615821565b9091555061457a90504262093a80615684565b603155602e546000805160206159778339815191529060029061459f9060019061578f565b6040516145ad929190615861565b60405180910390a15b603254421061461e57602f80549060006145cf83615821565b909155506145e29050426228206f615684565b603255602f54600080516020615977833981519152906003906146079060019061578f565b604051614615929190615861565b60405180910390a15b565b6001600160a01b0382166000908152603660205260409020805460ff191682158015919091179091556146b05760085460405163031e79db60e41b81526001600160a01b03909116906331e79db09061467d908590600401615336565b600060405180830381600087803b15801561469757600080fd5b505af11580156146ab573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60006135c283836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061515b565b60006135c283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614461565b60008211614779575050565b81614783306122fb565b101561479557614792306122fb565b91505b60408051600280825260608201835260009260208301908036833701905050905030816000815181106147ca576147ca615874565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148479190615651565b8160018151811061485a5761485a615874565b6001600160a01b03928316602091820292909201015260065461488091309116856135c9565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906148b99086906000908690889042906004016158ce565b600060405180830381600087803b1580156148d357600080fd5b505af11580156148e7573d6000803e3d6000fd5b50505050505050565b6006546149089030906001600160a01b0316846135c9565b60065460095460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015614978573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ab69190615623565b6001600160a01b0383166149c35760405162461bcd60e51b81526004016115a9906157dc565b6001600160a01b038216614a255760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016115a9565b614a62816040518060600160405280602681526020016159b7602691396001600160a01b0386166000908152602081905260409020549190614461565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614a919082613565565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016136e1565b60008211614aef57505050565b60085460405163c32c293d60e01b8152600091829182916001600160a01b03169063c32c293d90614b24908790600401615336565b602060405180830381865afa158015614b41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b659190615651565b6001600160a01b031603614c9457479150614b80848461476d565b614b8a478361472b565b6001600160a01b038416600090815260276020526040812080549293508692909190614bb7908490615684565b9250508190555083602a6000828254614bd09190615684565b90915550506001600160a01b03831660009081526028602052604081208054839290614bfd908490615684565b9250508190555080602b6000828254614c169190615684565b90915550506001600160a01b0383166000818152601c60205260409081902054602d54602e54602f54935186959394600080516020615a2583398151915293614c68938d939192909160001990615833565b60405180910390a4614c78615189565b6045546001600160a01b0316614c8f575050505050565b614d43565b6045546001600160a01b0316614d4357479150614cb1843061476d565b614cbb478361472b565b6001600160a01b038416600090815260276020526040812080549293508692909190614ce8908490615684565b9250508190555083602a6000828254614d019190615684565b9091555050604580546001600160a01b038086166001600160a01b03199283161790925560468390556047805492881692909116919091179055611ab6615189565b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015614dad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614dd19190615651565b81600081518110614de457614de4615874565b6001600160a01b03928316602091820292909201015260085460455460405163c32c293d60e01b81529183169263c32c293d92614e279290911690600401615336565b602060405180830381865afa158015614e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e689190615651565b81600181518110614e7b57614e7b615874565b6001600160a01b03928316602091820292909201015260065460465460455460405163b6f9de9560e01b81529284169363b6f9de9593614ec7926000928892911690429060040161590a565b6000604051808303818588803b158015614ee057600080fd5b505af193505050508015614ef2575060015b506046546045546001600160a01b031660009081526028602052604081208054909190614f20908490615684565b9091555050604654602b8054600090614f3a908490615684565b9091555050604654604554604754602d54602e54602f5460405186956001600160a01b0390811695600080516020615a2583398151915295614f86959290911693909260001990615833565b60405180910390a460085460405163c32c293d60e01b81526000916001600160a01b03169063c32c293d90614fbf908890600401615336565b602060405180830381865afa158015614fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150009190615651565b6001600160a01b03161461504857604580546001600160a01b038087166001600160a01b0319928316179092556046849055604780549289169290911691909117905561506a565b604580546001600160a01b031990811690915560006046556047805490911690555b615072615189565b505050505050565b60008260000361508c575060006117b4565b6000615098838561593f565b9050826150a585836157ba565b146135c25760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016115a9565b600754600090600160a81b900460ff1661511e57615119826122fb565b6117b4565b6001600160a01b0382166000908152603760205260409020546117b490606490613ef09061514c9083613565565b615155866122fb565b9061507a565b6000818361517c5760405162461bcd60e51b81526004016115a99190615226565b50600061449284866157ba565b601d80546000908152601f60208181526040808420546001600160a01b03168452601c825280842084905584548452919052812080546001600160a01b0319169055815491906151d883615821565b9190505550601e54601d541061461e576000601d819055601e55565b6000806000806080858703121561520a57600080fd5b5050823594602084013594506040840135936060013592509050565b600060208083528351808285015260005b8181101561525357858101830151858201604001528201615237565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611dc357600080fd5b60006020828403121561529b57600080fd5b81356135c281615274565b600080604083850312156152b957600080fd5b82356152c481615274565b946020939093013593505050565b600080604083850312156152e557600080fd5b50508035926020909101359150565b60008060006060848603121561530957600080fd5b833561531481615274565b925060208401359150604084013561532b81615274565b809150509250925092565b6001600160a01b0391909116815260200190565b60008060006060848603121561535f57600080fd5b505081359360208301359350604090920135919050565b93845260208401929092526040830152606082015260800190565b6000806000606084860312156153a657600080fd5b83356153b181615274565b925060208401356153c181615274565b929592945050506040919091013590565b8015158114611dc357600080fd5b6000602082840312156153f257600080fd5b81356135c2816153d2565b9283526020830191909152604082015260600190565b60006020828403121561542557600080fd5b5035919050565b600080600080600060a0868803121561544457600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6000806040838503121561547a57600080fd5b823561548581615274565b91506020830135615495816153d2565b809150509250929050565b600080604083850312156154b357600080fd5b82356154be81615274565b9150602083013561549581615274565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f43616e6e6f742073657420424e4272657761726420666565206f766572203225604082015260600190565b600181811c9082168061554c57607f821691505b60208210810361556c57634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561558457600080fd5b5051919050565b60208082526027908201527f63616e6e6f7420736574207377617020616d6f756e742067726561746572207460408201526668616e202e322560c81b606082015260800190565b6001600160a01b039290921682521515602082015260400190565b6000602082840312156155ff57600080fd5b81516135c2816153d2565b6001600160a01b03929092168252602082015260400190565b60008060006060848603121561563857600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561566357600080fd5b81516135c281615274565b634e487b7160e01b600052601160045260246000fd5b808201808211156117b4576117b461566e565b81810360008312801583831316838312821617156156b7576156b761566e565b5092915050565b80820182811260008312801582168215821617156156de576156de61566e565b505092915050565b60006001600160ff1b0182016156fe576156fe61566e565b5060010190565b60008060008060008060c0878903121561571e57600080fd5b865161572981615274565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6001600160a01b0392831681529116602082015260400190565b938452602084019290925260408301521515606082015260800190565b818103818111156117b4576117b461566e565b92835260208301919091521515604082015260600190565b6000826157d757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6000600182016156fe576156fe61566e565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b60ff929092168252602082015260400190565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156158c35781516001600160a01b03168752958201959082019060010161589e565b509495945050505050565b85815284602082015260a0604082015260006158ed60a083018661588a565b6001600160a01b0394909416606083015250608001529392505050565b848152608060208201526000615923608083018661588a565b6001600160a01b03949094166040830152506060015292915050565b80820281158282048414176117b4576117b461566e56fec864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a982fc0b521dd59fa7e30ff6ab6b5392d216cb0bb977e9f16006d7b55b1d726b2935826dab182292d2e5b8adf2856697983c65b882fa567a247222747a43e606d1945524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63658e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd045524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636513556b7ecf6a9419a73bcfcb023a4c3f93d2d1991ed91cb718572f4e079ad3d245524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122043b36a9766695d5643ba90bb6f80334e1b972bc0ef0992569d20f0b12b3d4d9c64736f6c63430008120033
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.