Address Details
contract
token
0xc63C3243601E038286a82c0f97F47BF20f2f1b82
- Token
- metaCelo Token (cMETA)
- Creator
- 0xb1eac9–8398f0 at 0x06d8f8–3bc01d
- Balance
- 0 CELO ( )
- Locked CELO Balance
- 0.00 CELO
- Voting CELO Balance
- 0.00 CELO
- Pending Unlocked Gold
- 0.00 CELO
- Tokens
-
Fetching tokens...
- Transactions
- Fetching transactions...
- Transfers
- Fetching transfers...
- Gas Used
- Fetching gas used...
- Last Balance Update
- 11418274
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- metaCeloGameNFT
- Optimization enabled
- true
- Compiler version
- v0.8.7+commit.e28d00a7
- Optimization runs
- 200
- EVM Version
- london
- Verified at
- 2022-01-03T05:32:02.864802Z
contracts/metaCelo.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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 ); } 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; } } library Address { function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { _transferOwnership(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } abstract contract BPContract{ function protect( address sender, address receiver, uint256 amount ) external virtual; } 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; } 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 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 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; } // pragma solidity >=0.6.2; 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); } // pragma solidity >=0.6.2; 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 metaCeloGameNFT is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; address payable marketingAddress = payable(0x53348644D92A82f3359eC71B8d277245b0df78cb); address public rewardPool = 0xcF51167864B23A74B796483f2cCa7A999E1CF44a; address public _routerAddress = 0x1421bDe4B10e8dd459b3BCb598810B1337D56842; address public CELO = address(0x471EcE3750Da237f93B8E339c536989b8978a438); mapping(address => uint256) private _rOwned; mapping(address => uint256) private _tOwned; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) public _whitelist; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcluded; address[] private _excluded; uint256 private constant MAX = ~uint256(0); uint256 private _tTotal = 100000000 * 10**18; uint256 private _rTotal = (MAX - (MAX % _tTotal)); uint256 private _tFeeTotal; string private _name = "metaCelo Token"; string private _symbol = "cMETA"; uint8 private _decimals = 18; uint256 public _taxFee = 0; uint256 private _previousTaxFee = _taxFee; uint256 public _liquidityFee = 5; uint256 private _previousLiquidityFee = _liquidityFee; uint256 public marketingDivisor = 2; uint256 public _maxTxAmount = 1000000 * 10**18; uint256 private minimumTokensBeforeSwap = 100000 * 10**18; uint256 private buyBackUpperLimit = 50000 * 10**18; IUniswapV2Router02 public immutable uniswapV2Router; address public immutable uniswapV2Pair; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = false; bool public buyBackEnabled = false; BPContract public BP; bool public bpEnabled; bool public BPDisabledForever = false; uint256 public blacklistValidUntil; mapping (address => bool) public isBlacklisted; event Log(string message); event SetTaxFeePercent(uint256 amount); event SetLiquidityFeePercent(uint256 liquidityFee); event SetMaxTxPercent(uint256 maxTxAmount); event SetMarketingDivisor(uint256 divisor); event SetNumTokensSellToAddToLiquidity(uint256 minimumTokensBeforeSwap); event SetMarketingAddress(address marketingAddress); event SetRewardPool(address rewardPool); event RewardLiquidityProviders(uint256 tokenAmount); event BuyBackEnabledUpdated(bool enabled); event SetBuybackUpperLimit(uint256 tokenAmount); event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event SwapETHForTokens(uint256 amountIn, address[] path); event SwapTokensForETH(uint256 amountIn, address[] path); modifier lockTheSwap() { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } modifier onlyWhitelist() { require(_whitelist[msg.sender] == true); _; } constructor() { _rOwned[_msgSender()] = _rTotal; // Mainnet IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( _routerAddress ); uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), CELO); uniswapV2Router = _uniswapV2Router; blacklistValidUntil = block.timestamp + 3 days; _isExcludedFromFee[owner()] = true; _isExcludedFromFee[address(this)] = true; _approve(address(this), _routerAddress, _tTotal); _approve(_msgSender(), _routerAddress, _tTotal); _whitelist[address(this)] = true; _whitelist[_routerAddress] = true; _whitelist[owner()] = true; emit Transfer(address(0), _msgSender(), _tTotal); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _tTotal; } function balanceOf(address account) public view override returns (uint256) { if (_isExcluded[account]) return _tOwned[account]; return tokenFromReflection(_rOwned[account]); } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public 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 isExcludedFromReward(address account) public view returns (bool) { return _isExcluded[account]; } function totalFees() public view returns (uint256) { return _tFeeTotal; } function minimumTokensBeforeSwapAmount() public view returns (uint256) { return minimumTokensBeforeSwap; } function buyBackUpperLimitAmount() public view returns (uint256) { return buyBackUpperLimit; } function deliver(uint256 tAmount) public { address sender = _msgSender(); require( !_isExcluded[sender], "Excluded addresses cannot call this function" ); (uint256 rAmount, , , , , ) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rTotal = _rTotal.sub(rAmount); _tFeeTotal = _tFeeTotal.add(tAmount); } function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns (uint256) { require(tAmount <= _tTotal, "Amount must be less than supply"); if (!deductTransferFee) { (uint256 rAmount, , , , , ) = _getValues(tAmount); return rAmount; } else { (, uint256 rTransferAmount, , , , ) = _getValues(tAmount); return rTransferAmount; } } function tokenFromReflection(uint256 rAmount) public view returns (uint256) { require( rAmount <= _rTotal, "Amount must be less than total reflections" ); uint256 currentRate = _getRate(); return rAmount.div(currentRate); } function excludeFromReward(address account) public onlyOwner { require(!_isExcluded[account], "Account is already excluded"); if (_rOwned[account] > 0) { _tOwned[account] = tokenFromReflection(_rOwned[account]); } _isExcluded[account] = true; _excluded.push(account); } function includeInReward(address account) external onlyOwner { require(_isExcluded[account], "Account is already excluded"); for (uint256 i = 0; i < _excluded.length; i++) { if (_excluded[i] == account) { _excluded[i] = _excluded[_excluded.length - 1]; _tOwned[account] = 0; _isExcluded[account] = false; _excluded.pop(); break; } } } function _approve( address owner, address spender, uint256 amount ) private { 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 _transfer( address from, address to, uint256 amount ) private { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than zero"); if (bpEnabled && !BPDisabledForever){ BP.protect(from, to, amount); } if (from != owner() && to != owner()) { require( amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount." ); } uint256 contractTokenBalance = balanceOf(address(this)); bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap; if (!inSwapAndLiquify && swapAndLiquifyEnabled && to == uniswapV2Pair) { if (overMinimumTokenBalance) { contractTokenBalance = minimumTokensBeforeSwap; swapTokens(contractTokenBalance); } uint256 balance = address(this).balance; if (buyBackEnabled && balance > uint256(1 * 10**18)) { if (balance > buyBackUpperLimit) balance = buyBackUpperLimit; buyBackTokens(balance.div(20)); } } bool takeFee = true; //if any account belongs to _isExcludedFromFee account then remove the fee if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) { takeFee = false; } _tokenTransfer(from, to, amount, takeFee); } function swapTokens(uint256 contractTokenBalance) private lockTheSwap { uint256 initialBalance = address(this).balance; swapTokensForEth(contractTokenBalance); uint256 transferredBalance = address(this).balance.sub(initialBalance); //Send to Marketing address transferToAddressETH( marketingAddress, transferredBalance.div(_liquidityFee).mul(marketingDivisor) ); } function buyBackTokens(uint256 amount) private lockTheSwap { if (amount > 0) { swapETHForTokens(amount); } } function swapTokensForEth(uint256 tokenAmount) private { if ( _allowances[address(this)][address(uniswapV2Router)] < tokenAmount ) { _approve(address(this), address(uniswapV2Router), _rTotal); } // generate the uniswap pair path of token -> CELO address[] memory path = new address[](2); path[0] = address(this); path[1] = CELO; // make the swap try uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of CELO path, address(this), // The contract block.timestamp ) {} catch { emit Log("external call failed"); } emit SwapTokensForETH(tokenAmount, path); } function swapETHForTokens(uint256 amount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = CELO; path[1] = address(this); // make the swap try uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(amount,0, path, rewardPool, block.timestamp) {} catch { emit Log("external call failed"); } emit SwapETHForTokens(amount, path); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { if ( _allowances[address(this)][address(uniswapV2Router)] < tokenAmount ) { _approve(address(this), address(uniswapV2Router), _rTotal); } // add the liquidity try uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ) {} catch { emit Log("external call failed"); } } function _tokenTransfer( address sender, address recipient, uint256 amount, bool takeFee ) private { if (!takeFee) removeAllFee(); if (_isExcluded[sender] && !_isExcluded[recipient]) { _transferFromExcluded(sender, recipient, amount); } else if (!_isExcluded[sender] && _isExcluded[recipient]) { _transferToExcluded(sender, recipient, amount); } else if (_isExcluded[sender] && _isExcluded[recipient]) { _transferBothExcluded(sender, recipient, amount); } else { _transferStandard(sender, recipient, amount); } if (!takeFee) restoreAllFee(); } function _transferStandard( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(sender, tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferToExcluded( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getValues(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(sender, tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferFromExcluded( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(sender, tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _transferBothExcluded( address sender, address recipient, uint256 tAmount ) private { ( uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getValues(tAmount); _tOwned[sender] = _tOwned[sender].sub(tAmount); _rOwned[sender] = _rOwned[sender].sub(rAmount); _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount); _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount); _takeLiquidity(sender, tLiquidity); _reflectFee(rFee, tFee); emit Transfer(sender, recipient, tTransferAmount); } function _reflectFee(uint256 rFee, uint256 tFee) private { _rTotal = _rTotal.sub(rFee); _tFeeTotal = _tFeeTotal.add(tFee); } function _getValues(uint256 tAmount) private view returns ( uint256, uint256, uint256, uint256, uint256, uint256 ) { ( uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity ) = _getTValues(tAmount); (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues( tAmount, tFee, tLiquidity, _getRate() ); return ( rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tLiquidity ); } function _getTValues(uint256 tAmount) private view returns ( uint256, uint256, uint256 ) { uint256 tFee = calculateTaxFee(tAmount); uint256 tLiquidity = calculateLiquidityFee(tAmount); uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity); return (tTransferAmount, tFee, tLiquidity); } function _getRValues( uint256 tAmount, uint256 tFee, uint256 tLiquidity, uint256 currentRate ) private pure returns ( uint256, uint256, uint256 ) { uint256 rAmount = tAmount.mul(currentRate); uint256 rFee = tFee.mul(currentRate); uint256 rLiquidity = tLiquidity.mul(currentRate); uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity); return (rAmount, rTransferAmount, rFee); } function _getRate() private view returns (uint256) { (uint256 rSupply, uint256 tSupply) = _getCurrentSupply(); return rSupply.div(tSupply); } function _getCurrentSupply() private view returns (uint256, uint256) { uint256 rSupply = _rTotal; uint256 tSupply = _tTotal; for (uint256 i = 0; i < _excluded.length; i++) { if ( _rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply ) return (_rTotal, _tTotal); rSupply = rSupply.sub(_rOwned[_excluded[i]]); tSupply = tSupply.sub(_tOwned[_excluded[i]]); } if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal); return (rSupply, tSupply); } function _takeLiquidity(address sender, uint256 tLiquidity) private { uint256 currentRate = _getRate(); uint256 rLiquidity = tLiquidity.mul(currentRate); _rOwned[address(this)] = _rOwned[address(this)].add(rLiquidity); if (_isExcluded[address(this)]) _tOwned[address(this)] = _tOwned[address(this)].add(tLiquidity); emit Transfer(sender, address(this), tLiquidity); } function calculateTaxFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_taxFee).div(10**2); } function calculateLiquidityFee(uint256 _amount) private view returns (uint256) { return _amount.mul(_liquidityFee).div(10**2); } function removeAllFee() private { if (_taxFee == 0 && _liquidityFee == 0) return; _previousTaxFee = _taxFee; _previousLiquidityFee = _liquidityFee; _taxFee = 0; _liquidityFee = 0; } function restoreAllFee() private { _taxFee = _previousTaxFee; _liquidityFee = _previousLiquidityFee; } function isExcludedFromFee(address account) public view returns (bool) { return _isExcludedFromFee[account]; } function excludeFromFee(address account) public onlyOwner { _isExcludedFromFee[account] = true; } function includeInFee(address account) public onlyOwner { _isExcludedFromFee[account] = false; } function setTaxFeePercent(uint256 taxFee) external onlyOwner { require(taxFee >= 0 && taxFee <= 10, "taxFee must from 0 to 10"); _taxFee = taxFee; emit SetTaxFeePercent(taxFee); } function setLiquidityFeePercent(uint256 liquidityFee) external onlyOwner { require( liquidityFee >= 0 && liquidityFee <= 10, "liquidityFee must from 0 to 10" ); _liquidityFee = liquidityFee; emit SetLiquidityFeePercent(liquidityFee); } function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner { require(maxTxPercent > 0, "maxTxPercent must be greater than 0"); _maxTxAmount = _tTotal.mul(maxTxPercent).div(10**2); emit SetMaxTxPercent(maxTxPercent); } function setMarketingDivisor(uint256 divisor) external onlyOwner { marketingDivisor = divisor; emit SetMarketingDivisor(divisor); } function setNumTokensSellToAddToLiquidity(uint256 _minimumTokensBeforeSwap) external onlyOwner { minimumTokensBeforeSwap = _minimumTokensBeforeSwap; emit SetNumTokensSellToAddToLiquidity(_minimumTokensBeforeSwap); } function setBuybackUpperLimit(uint256 buyBackLimit) external onlyOwner { buyBackUpperLimit = buyBackLimit * 10**18; emit SetBuybackUpperLimit(buyBackLimit * 10**18); } function setMarketingAddress(address _marketingAddress) external onlyOwner { marketingAddress = payable(_marketingAddress); emit SetMarketingAddress(_marketingAddress); } function setRewardPool(address _rewardPool) external onlyOwner { rewardPool = _rewardPool; emit SetRewardPool(_rewardPool); } function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } function setBuyBackEnabled(bool _enabled) public onlyOwner { buyBackEnabled = _enabled; emit BuyBackEnabledUpdated(_enabled); } function prepareForPreSale() external onlyOwner { setSwapAndLiquifyEnabled(false); _taxFee = 0; _liquidityFee = 0; _maxTxAmount = 100000000 * 10**18; } function afterPreSale() external onlyOwner { setSwapAndLiquifyEnabled(true); _taxFee = 0; _liquidityFee = 5; _maxTxAmount = 1000000 * 10**18; } function transferToAddressETH(address payable recipient, uint256 amount) private { recipient.transfer(amount); } function addWhitelist(address wallet) external onlyOwner { _whitelist[wallet] = true; } function removeWhitelist(address wallet) external onlyOwner { _whitelist[wallet] = false; } function setBPAddrss(address _bp) external onlyOwner { require(address(BP)== address(0), "Can only be initialized once"); BP = BPContract(_bp); } function setBpEnabled(bool _enabled) external onlyOwner { bpEnabled = _enabled; } function setBotProtectionDisableForever() external onlyOwner{ require(BPDisabledForever == false); BPDisabledForever = true; } function multiRemoveFromBlacklist(address[] calldata addresses) external onlyOwner { for (uint256 i=0; i < addresses.length; i++) { isBlacklisted[addresses[i]] = false; } } function multiBlacklist(address[] calldata addresses) external onlyOwner { require(block.timestamp < blacklistValidUntil, "blacklist is not availalbe anymore"); for (uint256 i=0; i < addresses.length; i++) { require(addresses[i] != uniswapV2Pair, "Can't blacklist pair address"); isBlacklisted[addresses[i]] = true; } } //to recieve ETH from uniswapV2Router when swaping receive() external payable onlyWhitelist {} }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BuyBackEnabledUpdated","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Log","inputs":[{"type":"string","name":"message","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RewardLiquidityProviders","inputs":[{"type":"uint256","name":"tokenAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetBuybackUpperLimit","inputs":[{"type":"uint256","name":"tokenAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetLiquidityFeePercent","inputs":[{"type":"uint256","name":"liquidityFee","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetMarketingAddress","inputs":[{"type":"address","name":"marketingAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"SetMarketingDivisor","inputs":[{"type":"uint256","name":"divisor","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetMaxTxPercent","inputs":[{"type":"uint256","name":"maxTxAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetNumTokensSellToAddToLiquidity","inputs":[{"type":"uint256","name":"minimumTokensBeforeSwap","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetRewardPool","inputs":[{"type":"address","name":"rewardPool","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"SetTaxFeePercent","inputs":[{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapAndLiquify","inputs":[{"type":"uint256","name":"tokensSwapped","internalType":"uint256","indexed":false},{"type":"uint256","name":"ethReceived","internalType":"uint256","indexed":false},{"type":"uint256","name":"tokensIntoLiqudity","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapAndLiquifyEnabledUpdated","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"SwapETHForTokens","inputs":[{"type":"uint256","name":"amountIn","internalType":"uint256","indexed":false},{"type":"address[]","name":"path","internalType":"address[]","indexed":false}],"anonymous":false},{"type":"event","name":"SwapTokensForETH","inputs":[{"type":"uint256","name":"amountIn","internalType":"uint256","indexed":false},{"type":"address[]","name":"path","internalType":"address[]","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract BPContract"}],"name":"BP","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"BPDisabledForever","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"CELO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_liquidityFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_routerAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_taxFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_whitelist","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addWhitelist","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"afterPreSale","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"blacklistValidUntil","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"bpEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"buyBackEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"buyBackUpperLimitAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deliver","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isBlacklisted","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"marketingDivisor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minimumTokensBeforeSwapAmount","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"multiBlacklist","inputs":[{"type":"address[]","name":"addresses","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"multiRemoveFromBlacklist","inputs":[{"type":"address[]","name":"addresses","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"prepareForPreSale","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFromToken","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"},{"type":"bool","name":"deductTransferFee","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeWhitelist","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"rewardPool","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBPAddrss","inputs":[{"type":"address","name":"_bp","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBotProtectionDisableForever","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBpEnabled","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuyBackEnabled","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuybackUpperLimit","inputs":[{"type":"uint256","name":"buyBackLimit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLiquidityFeePercent","inputs":[{"type":"uint256","name":"liquidityFee","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMarketingAddress","inputs":[{"type":"address","name":"_marketingAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMarketingDivisor","inputs":[{"type":"uint256","name":"divisor","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxTxPercent","inputs":[{"type":"uint256","name":"maxTxPercent","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNumTokensSellToAddToLiquidity","inputs":[{"type":"uint256","name":"_minimumTokensBeforeSwap","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRewardPool","inputs":[{"type":"address","name":"_rewardPool","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapAndLiquifyEnabled","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTaxFeePercent","inputs":[{"type":"uint256","name":"taxFee","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapAndLiquifyEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenFromReflection","inputs":[{"type":"uint256","name":"rAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFees","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"uniswapV2Pair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router02"}],"name":"uniswapV2Router","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60c0604052600180546001600160a01b03199081167353348644d92a82f3359ec71b8d277245b0df78cb1790915560028054821673cf51167864b23a74b796483f2cca7a999e1cf44a179055600380548216731421bde4b10e8dd459b3bcb598810b1337d568421790556004805490911673471ece3750da237f93b8e339c536989b8978a4381790556a52b7d2dcc80cd2e4000000600c819055620000a7906000196200071b565b620000b590600019620006c4565b600d5560408051808201909152600e8082526d36b2ba30a1b2b637902a37b5b2b760911b6020909201918252620000ef91600f91620005d1565b5060408051808201909152600580825264634d45544160d81b60209092019182526200011e91601091620005d1565b506011805460ff1916601290811790915560009081905560135560056014819055601555600260165569d3c21bcecceda100000060175569152d02c7e14af6800000601855690a968163f0a57b400000601955601a805462ffff0060ff60c01b01191690553480156200019057600080fd5b506200019c3362000455565b600d543360009081526005602090815260409182902092909255600354815163c45a015560e01b815291516001600160a01b0390911692839263c45a01559260048083019392829003018186803b158015620001f757600080fd5b505afa1580156200020c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000232919062000677565b600480546040516364e329cb60e11b815230928101929092526001600160a01b039081166024830152919091169063c9c6539690604401602060405180830381600087803b1580156200028457600080fd5b505af115801562000299573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bf919062000677565b6001600160601b0319606091821b811660a0529082901b16608052620002e9426203f480620006a9565b601b55600160096000620003056000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308082526009909452919091208054909316600117909255600354600c5462000361939190911690620004a5565b6200037e33600354600c546001600160a01b0390911690620004a5565b3060009081526008602081905260408083208054600160ff1991821681179092556003546001600160a01b031685529184208054909216811790915591620003ce6000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620003fe3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600c546040516200044691815260200190565b60405180910390a35062000754565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0383166200050d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620005705760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000504565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b828054620005df90620006de565b90600052602060002090601f0160209004810192826200060357600085556200064e565b82601f106200061e57805160ff19168380011785556200064e565b828001600101855582156200064e579182015b828111156200064e57825182559160200191906001019062000631565b506200065c92915062000660565b5090565b5b808211156200065c576000815560010162000661565b6000602082840312156200068a57600080fd5b81516001600160a01b0381168114620006a257600080fd5b9392505050565b60008219821115620006bf57620006bf6200073e565b500190565b600082821015620006d957620006d96200073e565b500390565b600181811c90821680620006f357607f821691505b602082108114156200071557634e487b7160e01b600052602260045260246000fd5b50919050565b6000826200073957634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b60805160601c60a05160601c6135c0620007aa600039600081816106da01528181611bf901526122500152600081816104bf015281816129b7015281816129f401528181612aa60152612c8401526135c06000f3fe6080604052600436106103b15760003560e01c8063715018a6116101e7578063bdc653ef1161010d578063dd62ed3e116100a0578063f2fde38b1161006f578063f2fde38b14610b5e578063f60e673e14610b7e578063f80f5dd514610b9e578063fe575a8714610bbe57600080fd5b8063dd62ed3e14610ab8578063e85e2ed714610afe578063ea2f0b3714610b1e578063f0f165af14610b3e57600080fd5b8063d543dbeb116100dc578063d543dbeb14610a4c578063d6b513cf14610a6c578063d9e6646014610a82578063dc3011d014610aa257600080fd5b8063bdc653ef146109d2578063c49b9a80146109e7578063c818c28014610a07578063cfdb63ac14610a1c57600080fd5b80638ee88c5311610185578063a073d37f11610154578063a073d37f1461095d578063a457c2d714610972578063a9059cbb14610992578063b0cb81f1146109b257600080fd5b80638ee88c53146108e1578063906e9dd01461090157806395d89b41146109215780639cfdbd5e1461093657600080fd5b80637d1db4a5116101c15780637d1db4a51461085457806382d2a4bb1461086a57806388f820201461088a5780638da5cb5b146108c357600080fd5b8063715018a6146107ff57806378238c371461081457806378c8cda71461083457600080fd5b80633685d419116102d75780634a74bb021161026a5780636053a0e3116102395780636053a0e31461078957806366666aa9146107a95780636bc87c3a146107c957806370a08231146107df57600080fd5b80634a74bb02146106fc5780635134f6ab1461071b57806352390c02146107305780635342acb41461075057600080fd5b80633fa00282116102a65780633fa0028214610668578063437823ec146106885780634549b039146106a857806349bd5a5e146106c857600080fd5b80633685d419146105f257806339509351146106125780633b124fe7146106325780633bd5d1731461064857600080fd5b806318160ddd1161034f57806329370cc61161031e57806329370cc61461056f5780632d8381191461058f578063313ce567146105af57806334616805146105d157600080fd5b806318160ddd146104f9578063206a8a221461050e57806323b872dd1461052e57806326898da91461054e57600080fd5b8063095ea7b31161038b578063095ea7b31461043e578063113898081461046e57806313114a9d1461048e5780631694505e146104ad57600080fd5b8063061c82d0146103de57806306fdde03146103fe57806307efbfdc1461042957600080fd5b366103d9573360009081526008602052604090205460ff1615156001146103d757600080fd5b005b600080fd5b3480156103ea57600080fd5b506103d76103f93660046132ce565b610bee565b34801561040a57600080fd5b50610413610cae565b604051610420919061334e565b60405180910390f35b34801561043557600080fd5b506103d7610d40565b34801561044a57600080fd5b5061045e610459366004613214565b610d8e565b6040519015158152602001610420565b34801561047a57600080fd5b506103d761048936600461318a565b610da5565b34801561049a57600080fd5b50600e545b604051908152602001610420565b3480156104b957600080fd5b506104e17f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610420565b34801561050557600080fd5b50600c5461049f565b34801561051a57600080fd5b506103d76105293660046132b3565b610e5b565b34801561053a57600080fd5b5061045e6105493660046131d8565b610ea3565b34801561055a57600080fd5b50601a5461045e90600160b81b900460ff1681565b34801561057b57600080fd5b506103d761058a3660046132b3565b610f0c565b34801561059b57600080fd5b5061049f6105aa3660046132ce565b610f81565b3480156105bb57600080fd5b5060115460405160ff9091168152602001610420565b3480156105dd57600080fd5b50601a5461045e90600160c01b900460ff1681565b3480156105fe57600080fd5b506103d761060d36600461318a565b611005565b34801561061e57600080fd5b5061045e61062d366004613214565b6111bc565b34801561063e57600080fd5b5061049f60125481565b34801561065457600080fd5b506103d76106633660046132ce565b6111f2565b34801561067457600080fd5b506103d761068336600461323e565b6112dc565b34801561069457600080fd5b506103d76106a336600461318a565b61137d565b3480156106b457600080fd5b5061049f6106c33660046132e7565b6113cb565b3480156106d457600080fd5b506104e17f000000000000000000000000000000000000000000000000000000000000000081565b34801561070857600080fd5b50601a5461045e90610100900460ff1681565b34801561072757600080fd5b506103d7611458565b34801561073c57600080fd5b506103d761074b36600461318a565b6114a7565b34801561075c57600080fd5b5061045e61076b36600461318a565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561079557600080fd5b50601a5461045e9062010000900460ff1681565b3480156107b557600080fd5b506002546104e1906001600160a01b031681565b3480156107d557600080fd5b5061049f60145481565b3480156107eb57600080fd5b5061049f6107fa36600461318a565b6115fa565b34801561080b57600080fd5b506103d7611659565b34801561082057600080fd5b506103d761082f36600461318a565b61168f565b34801561084057600080fd5b506103d761084f36600461318a565b611707565b34801561086057600080fd5b5061049f60175481565b34801561087657600080fd5b506103d76108853660046132ce565b611752565b34801561089657600080fd5b5061045e6108a536600461318a565b6001600160a01b03166000908152600a602052604090205460ff1690565b3480156108cf57600080fd5b506000546001600160a01b03166104e1565b3480156108ed57600080fd5b506103d76108fc3660046132ce565b6117d2565b34801561090d57600080fd5b506103d761091c36600461318a565b611882565b34801561092d57600080fd5b506104136118fa565b34801561094257600080fd5b50601a546104e190630100000090046001600160a01b031681565b34801561096957600080fd5b5060185461049f565b34801561097e57600080fd5b5061045e61098d366004613214565b611909565b34801561099e57600080fd5b5061045e6109ad366004613214565b611958565b3480156109be57600080fd5b506103d76109cd3660046132ce565b611965565b3480156109de57600080fd5b5060195461049f565b3480156109f357600080fd5b506103d7610a023660046132b3565b6119c4565b348015610a1357600080fd5b506103d7611a37565b348015610a2857600080fd5b5061045e610a3736600461318a565b60086020526000908152604090205460ff1681565b348015610a5857600080fd5b506103d7610a673660046132ce565b611a8d565b348015610a7857600080fd5b5061049f60165481565b348015610a8e57600080fd5b506003546104e1906001600160a01b031681565b348015610aae57600080fd5b5061049f601b5481565b348015610ac457600080fd5b5061049f610ad33660046131a5565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b348015610b0a57600080fd5b506103d7610b1936600461323e565b611b66565b348015610b2a57600080fd5b506103d7610b3936600461318a565b611d06565b348015610b4a57600080fd5b506103d7610b593660046132ce565b611d51565b348015610b6a57600080fd5b506103d7610b7936600461318a565b611db0565b348015610b8a57600080fd5b506004546104e1906001600160a01b031681565b348015610baa57600080fd5b506103d7610bb936600461318a565b611e4b565b348015610bca57600080fd5b5061045e610bd936600461318a565b601c6020526000908152604090205460ff1681565b6000546001600160a01b03163314610c215760405162461bcd60e51b8152600401610c18906133a3565b60405180910390fd5b600a811115610c725760405162461bcd60e51b815260206004820152601860248201527f746178466565206d7573742066726f6d203020746f20313000000000000000006044820152606401610c18565b60128190556040518181527f19da908cae03512cf29c19a5842b2904a06fd24ef9982759c78f9379831ed70f906020015b60405180910390a150565b6060600f8054610cbd906134a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce9906134a5565b8015610d365780601f10610d0b57610100808354040283529160200191610d36565b820191906000526020600020905b815481529060010190602001808311610d1957829003601f168201915b5050505050905090565b6000546001600160a01b03163314610d6a5760405162461bcd60e51b8152600401610c18906133a3565b610d7460016119c4565b6000601255600560145569d3c21bcecceda1000000601755565b6000610d9b338484611e99565b5060015b92915050565b6000546001600160a01b03163314610dcf5760405162461bcd60e51b8152600401610c18906133a3565b601a54630100000090046001600160a01b031615610e2f5760405162461bcd60e51b815260206004820152601c60248201527f43616e206f6e6c7920626520696e697469616c697a6564206f6e6365000000006044820152606401610c18565b601a80546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6000546001600160a01b03163314610e855760405162461bcd60e51b8152600401610c18906133a3565b601a8054911515600160b81b0260ff60b81b19909216919091179055565b6000610eb0848484611fbd565b610f028433610efd8560405180606001604052806028815260200161353e602891396001600160a01b038a1660009081526007602090815260408083203384529091529020549190612346565b611e99565b5060019392505050565b6000546001600160a01b03163314610f365760405162461bcd60e51b8152600401610c18906133a3565b601a8054821515620100000262ff0000199091161790556040517f3794234fa370c9f3b948dda3e3040530785b2ef1eb27dda3ffde478f4e2643c090610ca390831515815260200190565b6000600d54821115610fe85760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610c18565b6000610ff2612380565b9050610ffe83826123a3565b9392505050565b6000546001600160a01b0316331461102f5760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b0381166000908152600a602052604090205460ff166110975760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c18565b60005b600b548110156111b857816001600160a01b0316600b82815481106110c1576110c1613527565b6000918252602090912001546001600160a01b031614156111a657600b80546110ec9060019061348e565b815481106110fc576110fc613527565b600091825260209091200154600b80546001600160a01b03909216918390811061112857611128613527565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600682526040808220829055600a90925220805460ff19169055600b80548061118057611180613511565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806111b0816134e0565b91505061109a565b5050565b3360008181526007602090815260408083206001600160a01b03871684529091528120549091610d9b918590610efd90866123e5565b336000818152600a602052604090205460ff16156112675760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610c18565b600061127283612444565b505050506001600160a01b03841660009081526005602052604090205491925061129e91905082612493565b6001600160a01b038316600090815260056020526040902055600d546112c49082612493565b600d55600e546112d490846123e5565b600e55505050565b6000546001600160a01b031633146113065760405162461bcd60e51b8152600401610c18906133a3565b60005b81811015611378576000601c600085858581811061132957611329613527565b905060200201602081019061133e919061318a565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611370816134e0565b915050611309565b505050565b6000546001600160a01b031633146113a75760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6000600c5483111561141f5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c18565b8161143e57600061142f84612444565b50939550610d9f945050505050565b600061144984612444565b50929550610d9f945050505050565b6000546001600160a01b031633146114825760405162461bcd60e51b8152600401610c18906133a3565b61148c60006119c4565b600060128190556014556a52b7d2dcc80cd2e4000000601755565b6000546001600160a01b031633146114d15760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b0381166000908152600a602052604090205460ff161561153a5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c18565b6001600160a01b03811660009081526005602052604090205415611594576001600160a01b03811660009081526005602052604090205461157a90610f81565b6001600160a01b0382166000908152600660205260409020555b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b6001600160a01b0381166000908152600a602052604081205460ff161561163757506001600160a01b031660009081526006602052604090205490565b6001600160a01b038216600090815260056020526040902054610d9f90610f81565b6000546001600160a01b031633146116835760405162461bcd60e51b8152600401610c18906133a3565b61168d60006124d5565b565b6000546001600160a01b031633146116b95760405162461bcd60e51b8152600401610c18906133a3565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f173d73afad648e625c4a53878536f7a2debed1f51a04f21d728bce3cf534fcc190602001610ca3565b6000546001600160a01b031633146117315760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6000546001600160a01b0316331461177c5760405162461bcd60e51b8152600401610c18906133a3565b61178e81670de0b6b3a764000061346f565b6019557f453d1c4f1983c8f3e321a629b382fccd1a772598354930e59f5055603d6073a06117c482670de0b6b3a764000061346f565b604051908152602001610ca3565b6000546001600160a01b031633146117fc5760405162461bcd60e51b8152600401610c18906133a3565b600a81111561184d5760405162461bcd60e51b815260206004820152601e60248201527f6c6971756964697479466565206d7573742066726f6d203020746f20313000006044820152606401610c18565b60148190556040518181527fa080f06a1e9c2a432b1d35cf0a54ebca051cf5dce7433c3d8e94948436f1035690602001610ca3565b6000546001600160a01b031633146118ac5760405162461bcd60e51b8152600401610c18906133a3565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fdce39068f7a417bc8d3ac8767fb10b49595594c109641a8b25c1cd026df231db90602001610ca3565b606060108054610cbd906134a5565b6000610d9b3384610efd85604051806060016040528060258152602001613566602591393360009081526007602090815260408083206001600160a01b038d1684529091529020549190612346565b6000610d9b338484611fbd565b6000546001600160a01b0316331461198f5760405162461bcd60e51b8152600401610c18906133a3565b60168190556040518181527fd11685169b6ecd737b9fd111920598208ddd1f661a908d57e6f0da9dc8c90c9490602001610ca3565b6000546001600160a01b031633146119ee5760405162461bcd60e51b8152600401610c18906133a3565b601a80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610ca390831515815260200190565b6000546001600160a01b03163314611a615760405162461bcd60e51b8152600401610c18906133a3565b601a54600160c01b900460ff1615611a7857600080fd5b601a805460ff60c01b1916600160c01b179055565b6000546001600160a01b03163314611ab75760405162461bcd60e51b8152600401610c18906133a3565b60008111611b135760405162461bcd60e51b815260206004820152602360248201527f6d6178547850657263656e74206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608401610c18565b611b336064611b2d83600c5461252590919063ffffffff16565b906123a3565b6017556040518181527f570636dca93f35bb5dee1663ad99fe3f70745771395df08a5f7732130618b51890602001610ca3565b6000546001600160a01b03163314611b905760405162461bcd60e51b8152600401610c18906133a3565b601b544210611bec5760405162461bcd60e51b815260206004820152602260248201527f626c61636b6c697374206973206e6f7420617661696c616c626520616e796d6f604482015261726560f01b6064820152608401610c18565b60005b81811015611378577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316838383818110611c3357611c33613527565b9050602002016020810190611c48919061318a565b6001600160a01b03161415611c9f5760405162461bcd60e51b815260206004820152601c60248201527f43616e277420626c61636b6c69737420706169722061646472657373000000006044820152606401610c18565b6001601c6000858585818110611cb757611cb7613527565b9050602002016020810190611ccc919061318a565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611cfe816134e0565b915050611bef565b6000546001600160a01b03163314611d305760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6000546001600160a01b03163314611d7b5760405162461bcd60e51b8152600401610c18906133a3565b60188190556040518181527faf03e08ee79afbf1342640444643fbc5871a6b7623742379afd8a14401aa7d6f90602001610ca3565b6000546001600160a01b03163314611dda5760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b038116611e3f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c18565b611e48816124d5565b50565b6000546001600160a01b03163314611e755760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6001600160a01b038316611efb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c18565b6001600160a01b038216611f5c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c18565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166120215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c18565b6001600160a01b0382166120835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c18565b600081116120e55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c18565b601a54600160b81b900460ff1680156121085750601a54600160c01b900460ff16155b1561218457601a54604051637e2f3afd60e01b81526001600160a01b038581166004830152848116602483015260448201849052630100000090920490911690637e2f3afd90606401600060405180830381600087803b15801561216b57600080fd5b505af115801561217f573d6000803e3d6000fd5b505050505b6000546001600160a01b038481169116148015906121b057506000546001600160a01b03838116911614155b15612218576017548111156122185760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610c18565b6000612223306115fa565b601854601a549192508210159060ff161580156122475750601a54610100900460ff165b801561228457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316145b156122e757801561229d57601854915061229d826125a4565b601a54479062010000900460ff1680156122be5750670de0b6b3a764000081115b156122e5576019548111156122d257506019545b6122e56122e08260146123a3565b61260d565b505b6001600160a01b03851660009081526009602052604090205460019060ff168061232957506001600160a01b03851660009081526009602052604090205460ff165b15612332575060005b61233e86868684612636565b505050505050565b6000818484111561236a5760405162461bcd60e51b8152600401610c18919061334e565b506000612377848661348e565b95945050505050565b600080600061238d612761565b909250905061239c82826123a3565b9250505090565b6000610ffe83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506128e3565b6000806123f28385613435565b905083811015610ffe5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c18565b600080600080600080600080600061245b8a612911565b92509250925060008060006124798d8686612474612380565b612953565b919f909e50909c50959a5093985091965092945050505050565b6000610ffe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612346565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008261253457506000610d9f565b6000612540838561346f565b90508261254d858361344d565b14610ffe5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c18565b601a805460ff19166001179055476125bb826129a3565b60006125c74783612493565b6001546016546014549293506125fe926001600160a01b03909216916125f991906125f39086906123a3565b90612525565b612bb1565b5050601a805460ff1916905550565b601a805460ff1916600117905580156126295761262981612be7565b50601a805460ff19169055565b8061264357612643612d83565b6001600160a01b0384166000908152600a602052604090205460ff16801561268457506001600160a01b0383166000908152600a602052604090205460ff16155b1561269957612694848484612db1565b612745565b6001600160a01b0384166000908152600a602052604090205460ff161580156126da57506001600160a01b0383166000908152600a602052604090205460ff165b156126ea57612694848484612ed8565b6001600160a01b0384166000908152600a602052604090205460ff16801561272a57506001600160a01b0383166000908152600a602052604090205460ff165b1561273a57612694848484612f81565b612745848484612ff4565b8061275b5761275b601354601255601554601455565b50505050565b600d54600c546000918291825b600b548110156128b3578260056000600b848154811061279057612790613527565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806127fb57508160066000600b84815481106127d4576127d4613527565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561281157600d54600c54945094505050509091565b61285760056000600b848154811061282b5761282b613527565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612493565b925061289f60066000600b848154811061287357612873613527565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612493565b9150806128ab816134e0565b91505061276e565b50600c54600d546128c3916123a3565b8210156128da57600d54600c549350935050509091565b90939092509050565b600081836129045760405162461bcd60e51b8152600401610c18919061334e565b506000612377848661344d565b60008060008061292085613038565b9050600061292d86613054565b905060006129458261293f8986612493565b90612493565b979296509094509092505050565b60008080806129628886612525565b905060006129708887612525565b9050600061297e8888612525565b905060006129908261293f8686612493565b939b939a50919850919650505050505050565b3060009081526007602090815260408083207f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168452909152902054811115612a1b57612a1b307f0000000000000000000000000000000000000000000000000000000000000000600d54611e99565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612a5057612a50613527565b6001600160a01b039283166020918202929092010152600454825191169082906001908110612a8157612a81613527565b6001600160a01b039283166020918202929092010152604051635c11d79560e01b81527f000000000000000000000000000000000000000000000000000000000000000090911690635c11d79590612ae69085906000908690309042906004016133f9565b600060405180830381600087803b158015612b0057600080fd5b505af1925050508015612b11575060015b612b74577fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab604051612b6b90602080825260149082015273195e1d195c9b985b0818d85b1b0819985a5b195960621b604082015260600190565b60405180910390a15b7f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612ba59291906133d8565b60405180910390a15050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611378573d6000803e3d6000fd5b604080516002808252606082018352600092602083019080368337505060045482519293506001600160a01b031691839150600090612c2857612c28613527565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612c5c57612c5c613527565b6001600160a01b039283166020918202929092010152600254604051635c11d79560e01b81527f0000000000000000000000000000000000000000000000000000000000000000831692635c11d79592612cc4928792600092889291169042906004016133f9565b600060405180830381600087803b158015612cde57600080fd5b505af1925050508015612cef575060015b612d52577fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab604051612d4990602080825260149082015273195e1d195c9b985b0818d85b1b0819985a5b195960621b604082015260600190565b60405180910390a15b7f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a96248282604051612ba59291906133d8565b601254158015612d935750601454155b15612d9a57565b601280546013556014805460155560009182905555565b600080600080600080612dc387612444565b6001600160a01b038f16600090815260066020526040902054959b50939950919750955093509150612df59088612493565b6001600160a01b038a16600090815260066020908152604080832093909355600590522054612e249087612493565b6001600160a01b03808b1660009081526005602052604080822093909355908a1681522054612e5390866123e5565b6001600160a01b038916600090815260056020526040902055612e768982613070565b612e80848361313a565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612ec591815260200190565b60405180910390a3505050505050505050565b600080600080600080612eea87612444565b6001600160a01b038f16600090815260056020526040902054959b50939950919750955093509150612f1c9087612493565b6001600160a01b03808b16600090815260056020908152604080832094909455918b16815260069091522054612f5290846123e5565b6001600160a01b038916600090815260066020908152604080832093909355600590522054612e5390866123e5565b600080600080600080612f9387612444565b6001600160a01b038f16600090815260066020526040902054959b50939950919750955093509150612fc59088612493565b6001600160a01b038a16600090815260066020908152604080832093909355600590522054612f1c9087612493565b60008060008060008061300687612444565b6001600160a01b038f16600090815260056020526040902054959b50939950919750955093509150612e249087612493565b6000610d9f6064611b2d6012548561252590919063ffffffff16565b6000610d9f6064611b2d6014548561252590919063ffffffff16565b600061307a612380565b905060006130888383612525565b306000908152600560205260409020549091506130a590826123e5565b30600090815260056020908152604080832093909355600a9052205460ff16156130f457306000908152600660205260409020546130e390846123e5565b306000908152600660205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b600d546131479083612493565b600d55600e5461315790826123e5565b600e555050565b80356001600160a01b038116811461317557600080fd5b919050565b8035801515811461317557600080fd5b60006020828403121561319c57600080fd5b610ffe8261315e565b600080604083850312156131b857600080fd5b6131c18361315e565b91506131cf6020840161315e565b90509250929050565b6000806000606084860312156131ed57600080fd5b6131f68461315e565b92506132046020850161315e565b9150604084013590509250925092565b6000806040838503121561322757600080fd5b6132308361315e565b946020939093013593505050565b6000806020838503121561325157600080fd5b823567ffffffffffffffff8082111561326957600080fd5b818501915085601f83011261327d57600080fd5b81358181111561328c57600080fd5b8660208260051b85010111156132a157600080fd5b60209290920196919550909350505050565b6000602082840312156132c557600080fd5b610ffe8261317a565b6000602082840312156132e057600080fd5b5035919050565b600080604083850312156132fa57600080fd5b823591506131cf6020840161317a565b600081518084526020808501945080840160005b838110156133435781516001600160a01b03168752958201959082019060010161331e565b509495945050505050565b600060208083528351808285015260005b8181101561337b5785810183015185820160400152820161335f565b8181111561338d576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8281526040602082015260006133f1604083018461330a565b949350505050565b85815284602082015260a06040820152600061341860a083018661330a565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115613448576134486134fb565b500190565b60008261346a57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613489576134896134fb565b500290565b6000828210156134a0576134a06134fb565b500390565b600181811c908216806134b957607f821691505b602082108114156134da57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156134f4576134f46134fb565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122093dee708ecf2b2e19bc3155a9d204637e2e2ff0f5fa692fc325683c6fc4f00bd64736f6c63430008070033
Deployed ByteCode
0x6080604052600436106103b15760003560e01c8063715018a6116101e7578063bdc653ef1161010d578063dd62ed3e116100a0578063f2fde38b1161006f578063f2fde38b14610b5e578063f60e673e14610b7e578063f80f5dd514610b9e578063fe575a8714610bbe57600080fd5b8063dd62ed3e14610ab8578063e85e2ed714610afe578063ea2f0b3714610b1e578063f0f165af14610b3e57600080fd5b8063d543dbeb116100dc578063d543dbeb14610a4c578063d6b513cf14610a6c578063d9e6646014610a82578063dc3011d014610aa257600080fd5b8063bdc653ef146109d2578063c49b9a80146109e7578063c818c28014610a07578063cfdb63ac14610a1c57600080fd5b80638ee88c5311610185578063a073d37f11610154578063a073d37f1461095d578063a457c2d714610972578063a9059cbb14610992578063b0cb81f1146109b257600080fd5b80638ee88c53146108e1578063906e9dd01461090157806395d89b41146109215780639cfdbd5e1461093657600080fd5b80637d1db4a5116101c15780637d1db4a51461085457806382d2a4bb1461086a57806388f820201461088a5780638da5cb5b146108c357600080fd5b8063715018a6146107ff57806378238c371461081457806378c8cda71461083457600080fd5b80633685d419116102d75780634a74bb021161026a5780636053a0e3116102395780636053a0e31461078957806366666aa9146107a95780636bc87c3a146107c957806370a08231146107df57600080fd5b80634a74bb02146106fc5780635134f6ab1461071b57806352390c02146107305780635342acb41461075057600080fd5b80633fa00282116102a65780633fa0028214610668578063437823ec146106885780634549b039146106a857806349bd5a5e146106c857600080fd5b80633685d419146105f257806339509351146106125780633b124fe7146106325780633bd5d1731461064857600080fd5b806318160ddd1161034f57806329370cc61161031e57806329370cc61461056f5780632d8381191461058f578063313ce567146105af57806334616805146105d157600080fd5b806318160ddd146104f9578063206a8a221461050e57806323b872dd1461052e57806326898da91461054e57600080fd5b8063095ea7b31161038b578063095ea7b31461043e578063113898081461046e57806313114a9d1461048e5780631694505e146104ad57600080fd5b8063061c82d0146103de57806306fdde03146103fe57806307efbfdc1461042957600080fd5b366103d9573360009081526008602052604090205460ff1615156001146103d757600080fd5b005b600080fd5b3480156103ea57600080fd5b506103d76103f93660046132ce565b610bee565b34801561040a57600080fd5b50610413610cae565b604051610420919061334e565b60405180910390f35b34801561043557600080fd5b506103d7610d40565b34801561044a57600080fd5b5061045e610459366004613214565b610d8e565b6040519015158152602001610420565b34801561047a57600080fd5b506103d761048936600461318a565b610da5565b34801561049a57600080fd5b50600e545b604051908152602001610420565b3480156104b957600080fd5b506104e17f0000000000000000000000001421bde4b10e8dd459b3bcb598810b1337d5684281565b6040516001600160a01b039091168152602001610420565b34801561050557600080fd5b50600c5461049f565b34801561051a57600080fd5b506103d76105293660046132b3565b610e5b565b34801561053a57600080fd5b5061045e6105493660046131d8565b610ea3565b34801561055a57600080fd5b50601a5461045e90600160b81b900460ff1681565b34801561057b57600080fd5b506103d761058a3660046132b3565b610f0c565b34801561059b57600080fd5b5061049f6105aa3660046132ce565b610f81565b3480156105bb57600080fd5b5060115460405160ff9091168152602001610420565b3480156105dd57600080fd5b50601a5461045e90600160c01b900460ff1681565b3480156105fe57600080fd5b506103d761060d36600461318a565b611005565b34801561061e57600080fd5b5061045e61062d366004613214565b6111bc565b34801561063e57600080fd5b5061049f60125481565b34801561065457600080fd5b506103d76106633660046132ce565b6111f2565b34801561067457600080fd5b506103d761068336600461323e565b6112dc565b34801561069457600080fd5b506103d76106a336600461318a565b61137d565b3480156106b457600080fd5b5061049f6106c33660046132e7565b6113cb565b3480156106d457600080fd5b506104e17f00000000000000000000000069d8234230c2198f95194daf5cf9305c0141a38881565b34801561070857600080fd5b50601a5461045e90610100900460ff1681565b34801561072757600080fd5b506103d7611458565b34801561073c57600080fd5b506103d761074b36600461318a565b6114a7565b34801561075c57600080fd5b5061045e61076b36600461318a565b6001600160a01b031660009081526009602052604090205460ff1690565b34801561079557600080fd5b50601a5461045e9062010000900460ff1681565b3480156107b557600080fd5b506002546104e1906001600160a01b031681565b3480156107d557600080fd5b5061049f60145481565b3480156107eb57600080fd5b5061049f6107fa36600461318a565b6115fa565b34801561080b57600080fd5b506103d7611659565b34801561082057600080fd5b506103d761082f36600461318a565b61168f565b34801561084057600080fd5b506103d761084f36600461318a565b611707565b34801561086057600080fd5b5061049f60175481565b34801561087657600080fd5b506103d76108853660046132ce565b611752565b34801561089657600080fd5b5061045e6108a536600461318a565b6001600160a01b03166000908152600a602052604090205460ff1690565b3480156108cf57600080fd5b506000546001600160a01b03166104e1565b3480156108ed57600080fd5b506103d76108fc3660046132ce565b6117d2565b34801561090d57600080fd5b506103d761091c36600461318a565b611882565b34801561092d57600080fd5b506104136118fa565b34801561094257600080fd5b50601a546104e190630100000090046001600160a01b031681565b34801561096957600080fd5b5060185461049f565b34801561097e57600080fd5b5061045e61098d366004613214565b611909565b34801561099e57600080fd5b5061045e6109ad366004613214565b611958565b3480156109be57600080fd5b506103d76109cd3660046132ce565b611965565b3480156109de57600080fd5b5060195461049f565b3480156109f357600080fd5b506103d7610a023660046132b3565b6119c4565b348015610a1357600080fd5b506103d7611a37565b348015610a2857600080fd5b5061045e610a3736600461318a565b60086020526000908152604090205460ff1681565b348015610a5857600080fd5b506103d7610a673660046132ce565b611a8d565b348015610a7857600080fd5b5061049f60165481565b348015610a8e57600080fd5b506003546104e1906001600160a01b031681565b348015610aae57600080fd5b5061049f601b5481565b348015610ac457600080fd5b5061049f610ad33660046131a5565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b348015610b0a57600080fd5b506103d7610b1936600461323e565b611b66565b348015610b2a57600080fd5b506103d7610b3936600461318a565b611d06565b348015610b4a57600080fd5b506103d7610b593660046132ce565b611d51565b348015610b6a57600080fd5b506103d7610b7936600461318a565b611db0565b348015610b8a57600080fd5b506004546104e1906001600160a01b031681565b348015610baa57600080fd5b506103d7610bb936600461318a565b611e4b565b348015610bca57600080fd5b5061045e610bd936600461318a565b601c6020526000908152604090205460ff1681565b6000546001600160a01b03163314610c215760405162461bcd60e51b8152600401610c18906133a3565b60405180910390fd5b600a811115610c725760405162461bcd60e51b815260206004820152601860248201527f746178466565206d7573742066726f6d203020746f20313000000000000000006044820152606401610c18565b60128190556040518181527f19da908cae03512cf29c19a5842b2904a06fd24ef9982759c78f9379831ed70f906020015b60405180910390a150565b6060600f8054610cbd906134a5565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce9906134a5565b8015610d365780601f10610d0b57610100808354040283529160200191610d36565b820191906000526020600020905b815481529060010190602001808311610d1957829003601f168201915b5050505050905090565b6000546001600160a01b03163314610d6a5760405162461bcd60e51b8152600401610c18906133a3565b610d7460016119c4565b6000601255600560145569d3c21bcecceda1000000601755565b6000610d9b338484611e99565b5060015b92915050565b6000546001600160a01b03163314610dcf5760405162461bcd60e51b8152600401610c18906133a3565b601a54630100000090046001600160a01b031615610e2f5760405162461bcd60e51b815260206004820152601c60248201527f43616e206f6e6c7920626520696e697469616c697a6564206f6e6365000000006044820152606401610c18565b601a80546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b6000546001600160a01b03163314610e855760405162461bcd60e51b8152600401610c18906133a3565b601a8054911515600160b81b0260ff60b81b19909216919091179055565b6000610eb0848484611fbd565b610f028433610efd8560405180606001604052806028815260200161353e602891396001600160a01b038a1660009081526007602090815260408083203384529091529020549190612346565b611e99565b5060019392505050565b6000546001600160a01b03163314610f365760405162461bcd60e51b8152600401610c18906133a3565b601a8054821515620100000262ff0000199091161790556040517f3794234fa370c9f3b948dda3e3040530785b2ef1eb27dda3ffde478f4e2643c090610ca390831515815260200190565b6000600d54821115610fe85760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b6064820152608401610c18565b6000610ff2612380565b9050610ffe83826123a3565b9392505050565b6000546001600160a01b0316331461102f5760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b0381166000908152600a602052604090205460ff166110975760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c18565b60005b600b548110156111b857816001600160a01b0316600b82815481106110c1576110c1613527565b6000918252602090912001546001600160a01b031614156111a657600b80546110ec9060019061348e565b815481106110fc576110fc613527565b600091825260209091200154600b80546001600160a01b03909216918390811061112857611128613527565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600682526040808220829055600a90925220805460ff19169055600b80548061118057611180613511565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806111b0816134e0565b91505061109a565b5050565b3360008181526007602090815260408083206001600160a01b03871684529091528120549091610d9b918590610efd90866123e5565b336000818152600a602052604090205460ff16156112675760405162461bcd60e51b815260206004820152602c60248201527f4578636c75646564206164647265737365732063616e6e6f742063616c6c207460448201526b3434b990333ab731ba34b7b760a11b6064820152608401610c18565b600061127283612444565b505050506001600160a01b03841660009081526005602052604090205491925061129e91905082612493565b6001600160a01b038316600090815260056020526040902055600d546112c49082612493565b600d55600e546112d490846123e5565b600e55505050565b6000546001600160a01b031633146113065760405162461bcd60e51b8152600401610c18906133a3565b60005b81811015611378576000601c600085858581811061132957611329613527565b905060200201602081019061133e919061318a565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611370816134e0565b915050611309565b505050565b6000546001600160a01b031633146113a75760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b03166000908152600960205260409020805460ff19166001179055565b6000600c5483111561141f5760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c79006044820152606401610c18565b8161143e57600061142f84612444565b50939550610d9f945050505050565b600061144984612444565b50929550610d9f945050505050565b6000546001600160a01b031633146114825760405162461bcd60e51b8152600401610c18906133a3565b61148c60006119c4565b600060128190556014556a52b7d2dcc80cd2e4000000601755565b6000546001600160a01b031633146114d15760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b0381166000908152600a602052604090205460ff161561153a5760405162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c7564656400000000006044820152606401610c18565b6001600160a01b03811660009081526005602052604090205415611594576001600160a01b03811660009081526005602052604090205461157a90610f81565b6001600160a01b0382166000908152600660205260409020555b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b6001600160a01b0381166000908152600a602052604081205460ff161561163757506001600160a01b031660009081526006602052604090205490565b6001600160a01b038216600090815260056020526040902054610d9f90610f81565b6000546001600160a01b031633146116835760405162461bcd60e51b8152600401610c18906133a3565b61168d60006124d5565b565b6000546001600160a01b031633146116b95760405162461bcd60e51b8152600401610c18906133a3565b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f173d73afad648e625c4a53878536f7a2debed1f51a04f21d728bce3cf534fcc190602001610ca3565b6000546001600160a01b031633146117315760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6000546001600160a01b0316331461177c5760405162461bcd60e51b8152600401610c18906133a3565b61178e81670de0b6b3a764000061346f565b6019557f453d1c4f1983c8f3e321a629b382fccd1a772598354930e59f5055603d6073a06117c482670de0b6b3a764000061346f565b604051908152602001610ca3565b6000546001600160a01b031633146117fc5760405162461bcd60e51b8152600401610c18906133a3565b600a81111561184d5760405162461bcd60e51b815260206004820152601e60248201527f6c6971756964697479466565206d7573742066726f6d203020746f20313000006044820152606401610c18565b60148190556040518181527fa080f06a1e9c2a432b1d35cf0a54ebca051cf5dce7433c3d8e94948436f1035690602001610ca3565b6000546001600160a01b031633146118ac5760405162461bcd60e51b8152600401610c18906133a3565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527fdce39068f7a417bc8d3ac8767fb10b49595594c109641a8b25c1cd026df231db90602001610ca3565b606060108054610cbd906134a5565b6000610d9b3384610efd85604051806060016040528060258152602001613566602591393360009081526007602090815260408083206001600160a01b038d1684529091529020549190612346565b6000610d9b338484611fbd565b6000546001600160a01b0316331461198f5760405162461bcd60e51b8152600401610c18906133a3565b60168190556040518181527fd11685169b6ecd737b9fd111920598208ddd1f661a908d57e6f0da9dc8c90c9490602001610ca3565b6000546001600160a01b031633146119ee5760405162461bcd60e51b8152600401610c18906133a3565b601a80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15990610ca390831515815260200190565b6000546001600160a01b03163314611a615760405162461bcd60e51b8152600401610c18906133a3565b601a54600160c01b900460ff1615611a7857600080fd5b601a805460ff60c01b1916600160c01b179055565b6000546001600160a01b03163314611ab75760405162461bcd60e51b8152600401610c18906133a3565b60008111611b135760405162461bcd60e51b815260206004820152602360248201527f6d6178547850657263656e74206d75737420626520677265617465722074686160448201526206e20360ec1b6064820152608401610c18565b611b336064611b2d83600c5461252590919063ffffffff16565b906123a3565b6017556040518181527f570636dca93f35bb5dee1663ad99fe3f70745771395df08a5f7732130618b51890602001610ca3565b6000546001600160a01b03163314611b905760405162461bcd60e51b8152600401610c18906133a3565b601b544210611bec5760405162461bcd60e51b815260206004820152602260248201527f626c61636b6c697374206973206e6f7420617661696c616c626520616e796d6f604482015261726560f01b6064820152608401610c18565b60005b81811015611378577f00000000000000000000000069d8234230c2198f95194daf5cf9305c0141a3886001600160a01b0316838383818110611c3357611c33613527565b9050602002016020810190611c48919061318a565b6001600160a01b03161415611c9f5760405162461bcd60e51b815260206004820152601c60248201527f43616e277420626c61636b6c69737420706169722061646472657373000000006044820152606401610c18565b6001601c6000858585818110611cb757611cb7613527565b9050602002016020810190611ccc919061318a565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611cfe816134e0565b915050611bef565b6000546001600160a01b03163314611d305760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b03166000908152600960205260409020805460ff19169055565b6000546001600160a01b03163314611d7b5760405162461bcd60e51b8152600401610c18906133a3565b60188190556040518181527faf03e08ee79afbf1342640444643fbc5871a6b7623742379afd8a14401aa7d6f90602001610ca3565b6000546001600160a01b03163314611dda5760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b038116611e3f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c18565b611e48816124d5565b50565b6000546001600160a01b03163314611e755760405162461bcd60e51b8152600401610c18906133a3565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6001600160a01b038316611efb5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c18565b6001600160a01b038216611f5c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c18565b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166120215760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610c18565b6001600160a01b0382166120835760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610c18565b600081116120e55760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c18565b601a54600160b81b900460ff1680156121085750601a54600160c01b900460ff16155b1561218457601a54604051637e2f3afd60e01b81526001600160a01b038581166004830152848116602483015260448201849052630100000090920490911690637e2f3afd90606401600060405180830381600087803b15801561216b57600080fd5b505af115801561217f573d6000803e3d6000fd5b505050505b6000546001600160a01b038481169116148015906121b057506000546001600160a01b03838116911614155b15612218576017548111156122185760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b6064820152608401610c18565b6000612223306115fa565b601854601a549192508210159060ff161580156122475750601a54610100900460ff165b801561228457507f00000000000000000000000069d8234230c2198f95194daf5cf9305c0141a3886001600160a01b0316846001600160a01b0316145b156122e757801561229d57601854915061229d826125a4565b601a54479062010000900460ff1680156122be5750670de0b6b3a764000081115b156122e5576019548111156122d257506019545b6122e56122e08260146123a3565b61260d565b505b6001600160a01b03851660009081526009602052604090205460019060ff168061232957506001600160a01b03851660009081526009602052604090205460ff165b15612332575060005b61233e86868684612636565b505050505050565b6000818484111561236a5760405162461bcd60e51b8152600401610c18919061334e565b506000612377848661348e565b95945050505050565b600080600061238d612761565b909250905061239c82826123a3565b9250505090565b6000610ffe83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506128e3565b6000806123f28385613435565b905083811015610ffe5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c18565b600080600080600080600080600061245b8a612911565b92509250925060008060006124798d8686612474612380565b612953565b919f909e50909c50959a5093985091965092945050505050565b6000610ffe83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612346565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008261253457506000610d9f565b6000612540838561346f565b90508261254d858361344d565b14610ffe5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c18565b601a805460ff19166001179055476125bb826129a3565b60006125c74783612493565b6001546016546014549293506125fe926001600160a01b03909216916125f991906125f39086906123a3565b90612525565b612bb1565b5050601a805460ff1916905550565b601a805460ff1916600117905580156126295761262981612be7565b50601a805460ff19169055565b8061264357612643612d83565b6001600160a01b0384166000908152600a602052604090205460ff16801561268457506001600160a01b0383166000908152600a602052604090205460ff16155b1561269957612694848484612db1565b612745565b6001600160a01b0384166000908152600a602052604090205460ff161580156126da57506001600160a01b0383166000908152600a602052604090205460ff165b156126ea57612694848484612ed8565b6001600160a01b0384166000908152600a602052604090205460ff16801561272a57506001600160a01b0383166000908152600a602052604090205460ff165b1561273a57612694848484612f81565b612745848484612ff4565b8061275b5761275b601354601255601554601455565b50505050565b600d54600c546000918291825b600b548110156128b3578260056000600b848154811061279057612790613527565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806127fb57508160066000600b84815481106127d4576127d4613527565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b1561281157600d54600c54945094505050509091565b61285760056000600b848154811061282b5761282b613527565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490612493565b925061289f60066000600b848154811061287357612873613527565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390612493565b9150806128ab816134e0565b91505061276e565b50600c54600d546128c3916123a3565b8210156128da57600d54600c549350935050509091565b90939092509050565b600081836129045760405162461bcd60e51b8152600401610c18919061334e565b506000612377848661344d565b60008060008061292085613038565b9050600061292d86613054565b905060006129458261293f8986612493565b90612493565b979296509094509092505050565b60008080806129628886612525565b905060006129708887612525565b9050600061297e8888612525565b905060006129908261293f8686612493565b939b939a50919850919650505050505050565b3060009081526007602090815260408083207f0000000000000000000000001421bde4b10e8dd459b3bcb598810b1337d568426001600160a01b03168452909152902054811115612a1b57612a1b307f0000000000000000000000001421bde4b10e8dd459b3bcb598810b1337d56842600d54611e99565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612a5057612a50613527565b6001600160a01b039283166020918202929092010152600454825191169082906001908110612a8157612a81613527565b6001600160a01b039283166020918202929092010152604051635c11d79560e01b81527f0000000000000000000000001421bde4b10e8dd459b3bcb598810b1337d5684290911690635c11d79590612ae69085906000908690309042906004016133f9565b600060405180830381600087803b158015612b0057600080fd5b505af1925050508015612b11575060015b612b74577fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab604051612b6b90602080825260149082015273195e1d195c9b985b0818d85b1b0819985a5b195960621b604082015260600190565b60405180910390a15b7f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051612ba59291906133d8565b60405180910390a15050565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611378573d6000803e3d6000fd5b604080516002808252606082018352600092602083019080368337505060045482519293506001600160a01b031691839150600090612c2857612c28613527565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612c5c57612c5c613527565b6001600160a01b039283166020918202929092010152600254604051635c11d79560e01b81527f0000000000000000000000001421bde4b10e8dd459b3bcb598810b1337d56842831692635c11d79592612cc4928792600092889291169042906004016133f9565b600060405180830381600087803b158015612cde57600080fd5b505af1925050508015612cef575060015b612d52577fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab604051612d4990602080825260149082015273195e1d195c9b985b0818d85b1b0819985a5b195960621b604082015260600190565b60405180910390a15b7f6fd378a9d8b7345c2e5b18229aaf1e39d32b177b501d0a0d26a0a858a23a96248282604051612ba59291906133d8565b601254158015612d935750601454155b15612d9a57565b601280546013556014805460155560009182905555565b600080600080600080612dc387612444565b6001600160a01b038f16600090815260066020526040902054959b50939950919750955093509150612df59088612493565b6001600160a01b038a16600090815260066020908152604080832093909355600590522054612e249087612493565b6001600160a01b03808b1660009081526005602052604080822093909355908a1681522054612e5390866123e5565b6001600160a01b038916600090815260056020526040902055612e768982613070565b612e80848361313a565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612ec591815260200190565b60405180910390a3505050505050505050565b600080600080600080612eea87612444565b6001600160a01b038f16600090815260056020526040902054959b50939950919750955093509150612f1c9087612493565b6001600160a01b03808b16600090815260056020908152604080832094909455918b16815260069091522054612f5290846123e5565b6001600160a01b038916600090815260066020908152604080832093909355600590522054612e5390866123e5565b600080600080600080612f9387612444565b6001600160a01b038f16600090815260066020526040902054959b50939950919750955093509150612fc59088612493565b6001600160a01b038a16600090815260066020908152604080832093909355600590522054612f1c9087612493565b60008060008060008061300687612444565b6001600160a01b038f16600090815260056020526040902054959b50939950919750955093509150612e249087612493565b6000610d9f6064611b2d6012548561252590919063ffffffff16565b6000610d9f6064611b2d6014548561252590919063ffffffff16565b600061307a612380565b905060006130888383612525565b306000908152600560205260409020549091506130a590826123e5565b30600090815260056020908152604080832093909355600a9052205460ff16156130f457306000908152600660205260409020546130e390846123e5565b306000908152600660205260409020555b60405183815230906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050565b600d546131479083612493565b600d55600e5461315790826123e5565b600e555050565b80356001600160a01b038116811461317557600080fd5b919050565b8035801515811461317557600080fd5b60006020828403121561319c57600080fd5b610ffe8261315e565b600080604083850312156131b857600080fd5b6131c18361315e565b91506131cf6020840161315e565b90509250929050565b6000806000606084860312156131ed57600080fd5b6131f68461315e565b92506132046020850161315e565b9150604084013590509250925092565b6000806040838503121561322757600080fd5b6132308361315e565b946020939093013593505050565b6000806020838503121561325157600080fd5b823567ffffffffffffffff8082111561326957600080fd5b818501915085601f83011261327d57600080fd5b81358181111561328c57600080fd5b8660208260051b85010111156132a157600080fd5b60209290920196919550909350505050565b6000602082840312156132c557600080fd5b610ffe8261317a565b6000602082840312156132e057600080fd5b5035919050565b600080604083850312156132fa57600080fd5b823591506131cf6020840161317a565b600081518084526020808501945080840160005b838110156133435781516001600160a01b03168752958201959082019060010161331e565b509495945050505050565b600060208083528351808285015260005b8181101561337b5785810183015185820160400152820161335f565b8181111561338d576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8281526040602082015260006133f1604083018461330a565b949350505050565b85815284602082015260a06040820152600061341860a083018661330a565b6001600160a01b0394909416606083015250608001529392505050565b60008219821115613448576134486134fb565b500190565b60008261346a57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615613489576134896134fb565b500290565b6000828210156134a0576134a06134fb565b500390565b600181811c908216806134b957607f821691505b602082108114156134da57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156134f4576134f46134fb565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122093dee708ecf2b2e19bc3155a9d204637e2e2ff0f5fa692fc325683c6fc4f00bd64736f6c63430008070033