More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 154 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 15759508 | 772 days ago | IN | 0 ETH | 0.00104075 | ||||
Approve | 15531342 | 804 days ago | IN | 0 ETH | 0.00020798 | ||||
Transfer | 14580258 | 958 days ago | IN | 0 ETH | 0.00868041 | ||||
Transfer | 14579520 | 958 days ago | IN | 0 ETH | 0.00946833 | ||||
Transfer | 14519183 | 967 days ago | IN | 0 ETH | 0.01803805 | ||||
Set Swap Enabled | 14515245 | 968 days ago | IN | 0 ETH | 0.00137861 | ||||
Set Fee | 14515198 | 968 days ago | IN | 0 ETH | 0.00239122 | ||||
Set Fee | 14515154 | 968 days ago | IN | 0 ETH | 0.00293393 | ||||
Set Max Tx BPS | 14515143 | 968 days ago | IN | 0 ETH | 0.0015853 | ||||
Exclude From Fee... | 14515133 | 968 days ago | IN | 0 ETH | 0.00158431 | ||||
Set Fee | 14510103 | 969 days ago | IN | 0 ETH | 0.0018058 | ||||
Set Max Tx BPS | 14510092 | 969 days ago | IN | 0 ETH | 0.00120357 | ||||
Set Swap Enabled | 14510090 | 969 days ago | IN | 0 ETH | 0.00101242 | ||||
Set Swap Enabled | 14510073 | 969 days ago | IN | 0 ETH | 0.00093613 | ||||
Set Max Tx BPS | 14510060 | 969 days ago | IN | 0 ETH | 0.00111426 | ||||
Approve | 14510051 | 969 days ago | IN | 0 ETH | 0.00190569 | ||||
Set Trading Open... | 14510039 | 969 days ago | IN | 0 ETH | 0.00128812 | ||||
Exclude From Max... | 14507888 | 969 days ago | IN | 0 ETH | 0.00302852 | ||||
Exclude From Max... | 14507885 | 969 days ago | IN | 0 ETH | 0.00319767 | ||||
Exclude From Fee... | 14507882 | 969 days ago | IN | 0 ETH | 0.00356573 | ||||
Set Max Tx BPS | 14507875 | 969 days ago | IN | 0 ETH | 0.00192081 | ||||
Approve | 14503982 | 970 days ago | IN | 0 ETH | 0.00159689 | ||||
Approve | 14503775 | 970 days ago | IN | 0 ETH | 0.00295213 | ||||
Approve | 14503547 | 970 days ago | IN | 0 ETH | 0.00258466 | ||||
Set Max Tx BPS | 14503394 | 970 days ago | IN | 0 ETH | 0.00140012 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
14519183 | 967 days ago | 0.00016449 ETH | ||||
14519183 | 967 days ago | 0.00007243 ETH | ||||
14519183 | 967 days ago | 0.00008224 ETH | ||||
14519183 | 967 days ago | 0.00016449 ETH | ||||
14519183 | 967 days ago | 0.00004112 ETH | ||||
14519183 | 967 days ago | 0.00012337 ETH | ||||
14519183 | 967 days ago | 0.00016449 ETH | ||||
14519183 | 967 days ago | 0.00073731 ETH | ||||
14503305 | 970 days ago | 0.00147684 ETH | ||||
14503305 | 970 days ago | 0.00000291 ETH | ||||
14503305 | 970 days ago | 0.00073842 ETH | ||||
14503305 | 970 days ago | 0.00295369 ETH | ||||
14503305 | 970 days ago | 0.0033229 ETH | ||||
14503305 | 970 days ago | 0.00996871 ETH | ||||
14503305 | 970 days ago | 0.00886107 ETH | ||||
14503305 | 970 days ago | 0.02731796 ETH | ||||
14503276 | 970 days ago | 0.00159199 ETH | ||||
14503276 | 970 days ago | 0.00000368 ETH | ||||
14503276 | 970 days ago | 0.00079599 ETH | ||||
14503276 | 970 days ago | 0.00318398 ETH | ||||
14503276 | 970 days ago | 0.00358198 ETH | ||||
14503276 | 970 days ago | 0.01074595 ETH | ||||
14503276 | 970 days ago | 0.00955196 ETH | ||||
14503276 | 970 days ago | 0.02943526 ETH | ||||
14503276 | 970 days ago | 0.00317119 ETH |
Loading...
Loading
Contract Name:
PLUTUS
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; pragma experimental ABIEncoderV2; import "./DividendTracker.sol"; contract PLUTUS is Ownable, IERC20 { address UNISWAPROUTER = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address DEAD = 0x000000000000000000000000000000000000dEaD; address ZERO = 0x0000000000000000000000000000000000000000; string private _name = "PLUTUS CAPITAL HOLDINGS"; string private _symbol = "PCH"; // Allocations uint256 public _devTokenAllocation; uint256 public _dreamTokenAllocation; uint256 public _treasuryTokenAllocation; uint256 public _liquidityTokenAllocation; uint256 public _dividendsTokenAllocation; // Fess uint256 public treasuryFeeBuyBPS = 400; uint256 public dreamFeeBuyBPS = 0; uint256 public devFeeBuyBPS = 100; uint256 public liquidityFeeBuyBPS = 200; uint256 public dividendFeeBuyBPS = 300; uint256 public treasuryFeeSellBPS = 600; uint256 public dreamFeeSellBPS = 200; uint256 public devFeeSellBPS = 100; uint256 public liquidityFeeSellBPS = 100; uint256 public dividendFeeSellBPS = 0; uint256 public totalFeeBPS = treasuryFeeBuyBPS + dreamFeeBuyBPS + devFeeBuyBPS + liquidityFeeBuyBPS + dividendFeeBuyBPS; uint256 public swapTokensAtAmount = 100000 * (10**18); uint256 public lastSwapTime; bool swapAllToken = true; bool public swapEnabled = true; bool public taxEnabled = true; bool public compoundingEnabled = true; uint256 private _totalSupply = 1000000000000 * (10**18); bool private swapping; address payable public devWallet = payable(0x8dC8d7b9dE5D18c1aFE34A9376f9c0BaCB83e4FF); address payable public treasuryWallet = payable(0xAa30f62195fC8015cEe0eCFa4c392C7b166bE6cE); address payable public dreamWallet = payable(0x6930f422b668496Ed697aa41f3e6e324E6159718); address payable public techWallet = payable(0x7B0138C49570F78d45a07fCEcc11E70e605f33dB); mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) private _whiteList; mapping(address => bool) isBlacklisted; mapping(address => bool) private _isExcludedFromMaxTx; mapping(address => bool) private _isExcludedFromMaxWallet; event SwapAndAddLiquidity( uint256 tokensSwapped, uint256 nativeReceived, uint256 tokensIntoLiquidity ); event SendDividends(uint256 tokensSwapped, uint256 amount); event ExcludeFromFees(address indexed account, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event UpdateUniswapV2Router( address indexed newAddress, address indexed oldAddress ); event SwapEnabled(bool enabled); event TaxEnabled(bool enabled); event CompoundingEnabled(bool enabled); event BlacklistEnabled(bool enabled); DividendTracker public dividendTracker; IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; uint256 public maxTxBPS = 50; uint256 public maxWalletBPS = 200; uint256 public techSupportFeeBPS = 2500; uint256 tradingOpenDate = 1738844026; constructor() { dividendTracker = new DividendTracker(address(this), UNISWAPROUTER); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(UNISWAPROUTER); address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = _uniswapV2Pair; _balances[_msgSender()] += _totalSupply; emit Transfer(address(0), _msgSender(), _totalSupply); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public pure returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender] + addedValue ); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require( currentAllowance >= subtractedValue, "PLUTUS: decreased allowance below zero" ); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require( currentAllowance >= amount, "PLUTUS: transfer amount exceeds allowance" ); _approve(sender, _msgSender(), currentAllowance - amount); return true; } function setParametersToLaunch() external onlyOwner { // dividendTracker.excludeFromDividends(address(dividendTracker), true); // dividendTracker.excludeFromDividends(address(this), true); // dividendTracker.excludeFromDividends(owner(), true); // dividendTracker.excludeFromDividends(address(_uniswapV2Router), true); // dividendTracker.excludeFromDividends(address(DEAD), true); excludeFromFees(owner(), true); excludeFromFees(address(this), true); excludeFromFees(address(dividendTracker), true); excludeFromMaxTx(owner(), true); excludeFromMaxTx(address(this), true); excludeFromMaxTx(address(dividendTracker), true); excludeFromMaxWallet(owner(), true); excludeFromMaxWallet(address(this), true); excludeFromMaxWallet(address(dividendTracker), true); } function setTradingOpenDate(uint256 timestamp) external onlyOwner { tradingOpenDate = timestamp; } function _transfer( address sender, address recipient, uint256 amount ) internal { require( tradingOpenDate < block.timestamp || sender == owner() || recipient == owner() || _whiteList[sender] || _whiteList[recipient], "PLUTUS: Token isn't tradable yet" ); require(!isBlacklisted[sender], "PLUTUS: Sender is blacklisted"); require(!isBlacklisted[recipient], "PLUTUS: Recipient is blacklisted"); require(sender != address(0), "PLUTUS: transfer from the zero address"); require( recipient != address(0), "PLUTUS: transfer to the zero address" ); uint256 _maxTxAmount = (totalSupply() * maxTxBPS) / 10000; uint256 _maxWallet = (totalSupply() * maxWalletBPS) / 10000; require( amount <= _maxTxAmount || _isExcludedFromMaxTx[sender], "TX Limit Exceeded" ); if ( sender != owner() && recipient != address(this) && recipient != address(DEAD) && recipient != uniswapV2Pair ) { uint256 currentBalance = balanceOf(recipient); require( _isExcludedFromMaxWallet[recipient] || (currentBalance + amount <= _maxWallet) ); } uint256 senderBalance = _balances[sender]; require( senderBalance >= amount, "PLUTUS: transfer amount exceeds balance" ); uint256 contractTokenBalance = balanceOf(address(this)); uint256 contractNativeBalance = address(this).balance; bool canSwap = contractTokenBalance >= swapTokensAtAmount; if ( swapEnabled && canSwap && !swapping && sender != address(uniswapV2Router) && sender != owner() && recipient != owner() ) { swapping = true; if (!swapAllToken && contractTokenBalance > swapTokensAtAmount) { contractTokenBalance = swapTokensAtAmount; } _executeSwap(contractTokenBalance, contractNativeBalance); lastSwapTime = block.timestamp; swapping = false; } bool takeFee = false; if ( (sender == address(uniswapV2Pair) && recipient != address(uniswapV2Router)) || (recipient == address(uniswapV2Pair) && sender != address(uniswapV2Router)) ) { takeFee = true; } if (_isExcludedFromFees[sender] || _isExcludedFromFees[recipient]) { takeFee = false; } if (swapping || !taxEnabled) { takeFee = false; } if (takeFee) { //Set Fee for Buys if (sender == uniswapV2Pair) { totalFeeBPS = treasuryFeeBuyBPS + dreamFeeBuyBPS + devFeeBuyBPS + liquidityFeeBuyBPS + dividendFeeBuyBPS; _devTokenAllocation = (amount * devFeeBuyBPS) / totalFeeBPS; _dreamTokenAllocation = (amount * dreamFeeBuyBPS) / totalFeeBPS; _treasuryTokenAllocation = (amount * treasuryFeeBuyBPS) / totalFeeBPS; _liquidityTokenAllocation = (amount * liquidityFeeBuyBPS) / totalFeeBPS; _dividendsTokenAllocation = (amount * dividendFeeBuyBPS) / totalFeeBPS; } //Set Fee for Sells if (recipient == uniswapV2Pair) { totalFeeBPS = treasuryFeeSellBPS + dreamFeeSellBPS + devFeeSellBPS + liquidityFeeSellBPS + dividendFeeSellBPS; _devTokenAllocation = (amount * devFeeSellBPS) / totalFeeBPS; _dreamTokenAllocation = (amount * dreamFeeSellBPS) / totalFeeBPS; _treasuryTokenAllocation = (amount * treasuryFeeSellBPS) / totalFeeBPS; _liquidityTokenAllocation = (amount * liquidityFeeSellBPS) / totalFeeBPS; _dividendsTokenAllocation = (amount * dividendFeeSellBPS) / totalFeeBPS; } uint256 fees = (amount * totalFeeBPS) / 10000; amount -= fees; _executeTransfer(sender, address(this), fees); } _executeTransfer(sender, recipient, amount); dividendTracker.setBalance(payable(sender), balanceOf(sender)); dividendTracker.setBalance(payable(recipient), balanceOf(recipient)); } function _executeTransfer( address sender, address recipient, uint256 amount ) private { require(sender != address(0), "PLUTUS: transfer from the zero address"); require( recipient != address(0), "PLUTUS: transfer to the zero address" ); uint256 senderBalance = _balances[sender]; require( senderBalance >= amount, "PLUTUS: transfer amount exceeds balance" ); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } function _approve( address owner, address spender, uint256 amount ) private { require(owner != address(0), "PLUTUS: approve from the zero address"); require(spender != address(0), "PLUTUS: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function swapTokensForNative(uint256 tokens) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokens); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokens, 0, // accept any amount of native path, address(this), block.timestamp ); } function addLiquidity(uint256 tokens, uint256 native) private { _approve(address(this), address(uniswapV2Router), tokens); uniswapV2Router.addLiquidityETH{value: native}( address(this), tokens, 0, // slippage unavoidable 0, // slippage unavoidable address(this), block.timestamp ); } function includeToWhiteList(address[] memory _users) public onlyOwner { for (uint8 i = 0; i < _users.length; i++) { _whiteList[_users[i]] = true; } } function _executeSwap(uint256 tokens, uint256 native) private { if (tokens <= 0) { return; } uint256 totalAllocation = _treasuryTokenAllocation + _dreamTokenAllocation + _devTokenAllocation + _liquidityTokenAllocation + _dividendsTokenAllocation; // Calculations below might seem redundant, but we need them in case tokens < contract token balance uint256 tokensForTreasury; if (address(treasuryWallet) != address(0)) { tokensForTreasury = (tokens * _treasuryTokenAllocation) / totalAllocation; } uint256 tokensForDevelopment; if (address(devWallet) != address(0)) { tokensForDevelopment = (tokens * _devTokenAllocation) / totalAllocation; } uint256 tokensForDividends; if (dividendTracker.totalSupply() > 0) { tokensForDividends = (tokens * _dividendsTokenAllocation) / totalAllocation; } uint256 tokensForDream; if (address(dreamWallet) != address(0)) { tokensForDream = (tokens * _dreamTokenAllocation) / totalAllocation; } uint256 tokensForLiquidity = tokens - tokensForTreasury - tokensForDevelopment - tokensForDividends - tokensForDream; uint256 swapTokensLiquidity = tokensForLiquidity / 2; uint256 addTokensLiquidity = tokensForLiquidity - swapTokensLiquidity; uint256 swapTokensTotal = tokensForTreasury + tokensForDevelopment + tokensForDividends + tokensForDream + swapTokensLiquidity; uint256 initNativeBal = address(this).balance; swapTokensForNative(swapTokensTotal); uint256 nativeSwapped = (address(this).balance - initNativeBal) + native; uint256 nativeTreasury = (nativeSwapped * tokensForTreasury) / swapTokensTotal; uint256 nativeDev = (nativeSwapped * tokensForDevelopment) / swapTokensTotal; uint256 nativeDividends = (nativeSwapped * tokensForDividends) / swapTokensTotal; uint256 nativeDream = (nativeSwapped * tokensForDream) / swapTokensTotal; uint256 nativeLiquidity = nativeSwapped - nativeTreasury - nativeDev - nativeDividends - nativeDream; // Send tokens to treasury if (nativeTreasury > 0) { (bool success, ) = treasuryWallet.call{value: nativeTreasury}(""); require(success, "PLUTUS: Tx failed."); } // Send tokens to dev if (nativeDev > 0) { uint256 techSupportFee = (nativeDev * techSupportFeeBPS) / 10000; (bool successDev, ) = devWallet.call{ value: nativeDev - techSupportFee }(""); (bool successTech, ) = techWallet.call{value: techSupportFee}(""); require(successDev, "PLUTUS: Tx failed."); require(successTech, "PLUTUS: Tx failed."); } // Send tokens to dream if (nativeDream > 0) { (bool success, ) = dreamWallet.call{value: nativeDream}(""); require(success, "PLUTUS: Tx failed."); } // Add liquidity addLiquidity(addTokensLiquidity, nativeLiquidity); emit SwapAndAddLiquidity( swapTokensLiquidity, nativeLiquidity, addTokensLiquidity ); // Send redis to dividend tracker if (nativeDividends > 0) { (bool success, ) = address(dividendTracker).call{ value: nativeDividends }(""); if (success) { emit SendDividends(tokensForDividends, nativeDividends); } } _devTokenAllocation = 0; _dreamTokenAllocation = 0; _treasuryTokenAllocation = 0; _liquidityTokenAllocation = 0; _dividendsTokenAllocation = 0; } function manualSwapAndSend() public onlyOwner { uint256 contractTokenBalance = balanceOf(address(this)); uint256 contractNativeBalance = address(this).balance; if (!swapAllToken && contractTokenBalance > swapTokensAtAmount) { contractTokenBalance = swapTokensAtAmount; } _executeSwap(contractTokenBalance, contractNativeBalance); } function excludeFromFees(address account, bool excluded) public onlyOwner { require( _isExcludedFromFees[account] != excluded, "PLUTUS: account is already set to requested state" ); _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function isExcludedFromFees(address account) public view returns (bool) { return _isExcludedFromFees[account]; } function manualSendDividend(uint256 amount, address holder) external onlyOwner { dividendTracker.manualSendDividend(amount, holder); } function excludeFromDividends(address account, bool excluded) public onlyOwner { dividendTracker.excludeFromDividends(account, excluded); } function isExcludedFromDividends(address account) public view returns (bool) { return dividendTracker.isExcludedFromDividends(account); } function setWallets( address payable _treasuryWallet, address payable _devWallet, address payable _dreamWallet ) external onlyOwner { treasuryWallet = _treasuryWallet; devWallet = _devWallet; dreamWallet = _dreamWallet; } function setFee( uint256 _treasuryFeeBuy, uint256 _devFeeBuy, uint256 _liquidityFeeBuy, uint256 _dividendFeeBuy, uint256 _dreamFeeBuy, uint256 _treasuryFeeSell, uint256 _devFeeSell, uint256 _liquidityFeeSell, uint256 _dividendFeeSell, uint256 _dreamFeeSell ) external onlyOwner { treasuryFeeBuyBPS = _treasuryFeeBuy; dreamFeeBuyBPS = _dreamFeeBuy; devFeeBuyBPS = _devFeeBuy; liquidityFeeBuyBPS = _liquidityFeeBuy; dividendFeeBuyBPS = _dividendFeeBuy; treasuryFeeSellBPS = _treasuryFeeSell; dreamFeeSellBPS = _dreamFeeSell; devFeeSellBPS = _devFeeSell; liquidityFeeSellBPS = _liquidityFeeSell; dividendFeeSellBPS = _dividendFeeSell; totalFeeBPS = _treasuryFeeBuy + _liquidityFeeBuy + _dividendFeeBuy + _devFeeBuy + _dreamFeeBuy; } function claim() public { dividendTracker.processAccount(payable(_msgSender())); } function compound() public { require(compoundingEnabled, "PLUTUS: compounding is not enabled"); dividendTracker.compoundAccount(payable(_msgSender())); } function withdrawableDividendOf(address account) public view returns (uint256) { return dividendTracker.withdrawableDividendOf(account); } function withdrawnDividendOf(address account) public view returns (uint256) { return dividendTracker.withdrawnDividendOf(account); } function accumulativeDividendOf(address account) public view returns (uint256) { return dividendTracker.accumulativeDividendOf(account); } function getAccountInfo(address account) public view returns ( address, uint256, uint256, uint256, uint256 ) { return dividendTracker.getAccountInfo(account); } function getLastClaimTime(address account) public view returns (uint256) { return dividendTracker.getLastClaimTime(account); } function setSwapEnabled(bool _enabled) external onlyOwner { swapEnabled = _enabled; emit SwapEnabled(_enabled); } function setTaxEnabled(bool _enabled) external onlyOwner { taxEnabled = _enabled; emit TaxEnabled(_enabled); } function setCompoundingEnabled(bool _enabled) external onlyOwner { compoundingEnabled = _enabled; emit CompoundingEnabled(_enabled); } function updateDividendSettings( bool _swapEnabled, uint256 _swapTokensAtAmount, bool _swapAllToken ) external onlyOwner { swapEnabled = _swapEnabled; swapTokensAtAmount = _swapTokensAtAmount; swapAllToken = _swapAllToken; } function setMaxTxBPS(uint256 bps) external onlyOwner { maxTxBPS = bps; } function excludeFromMaxTx(address account, bool excluded) public onlyOwner { _isExcludedFromMaxTx[account] = excluded; } function isExcludedFromMaxTx(address account) public view returns (bool) { return _isExcludedFromMaxTx[account]; } function setMaxWalletBPS(uint256 bps) external onlyOwner { maxWalletBPS = bps; } function excludeFromMaxWallet(address account, bool excluded) public onlyOwner { _isExcludedFromMaxWallet[account] = excluded; } function isExcludedFromMaxWallet(address account) public view returns (bool) { return _isExcludedFromMaxWallet[account]; } function blackList(address _user, bool blacklist) public onlyOwner { require(!isBlacklisted[_user], "user already blacklisted"); isBlacklisted[_user] = blacklist; } function blackListMany(address[] memory _users) public onlyOwner { for (uint8 i = 0; i < _users.length; i++) { isBlacklisted[_users[i]] = true; } } receive() external payable {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require( currentAllowance >= amount, "ERC20: transfer amount exceeds allowance" ); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender] + addedValue ); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require( senderBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } 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 Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router02 { 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 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 DividendTracker is Ownable, IERC20 { address UNISWAPROUTER; string private _name = "PLUTUS_DividendTracker"; string private _symbol = "PLUTUS_DividendTracker"; uint256 public lastProcessedIndex; uint256 private _totalSupply; mapping(address => uint256) private _balances; uint256 private constant magnitude = 2**128; uint256 public immutable minTokenBalanceForDividends; uint256 private magnifiedDividendPerShare; uint256 public totalDividendsDistributed; uint256 public totalDividendsWithdrawn; address public tokenAddress; mapping(address => bool) public excludedFromDividends; mapping(address => int256) private magnifiedDividendCorrections; mapping(address => uint256) private withdrawnDividends; mapping(address => uint256) private lastClaimTimes; event DividendsDistributed(address indexed from, uint256 weiAmount); event DividendWithdrawn(address indexed to, uint256 weiAmount); event ExcludeFromDividends(address indexed account, bool excluded); event Claim(address indexed account, uint256 amount); event Compound(address indexed account, uint256 amount, uint256 tokens); struct AccountInfo { address account; uint256 withdrawableDividends; uint256 totalDividends; uint256 lastClaimTime; } constructor(address _tokenAddress, address _uniswapRouter) { minTokenBalanceForDividends = 10000 * (10**18); tokenAddress = _tokenAddress; UNISWAPROUTER = _uniswapRouter; } receive() external payable { distributeDividends(); } function distributeDividends() public payable { require(_totalSupply > 0); if (msg.value > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare + ((msg.value * magnitude) / _totalSupply); emit DividendsDistributed(msg.sender, msg.value); totalDividendsDistributed += msg.value; } } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if (excludedFromDividends[account]) { return; } if (newBalance >= minTokenBalanceForDividends) { _setBalance(account, newBalance); } else { _setBalance(account, 0); } } function excludeFromDividends(address account, bool excluded) external onlyOwner { require( excludedFromDividends[account] != excluded, "PLUTUS_DividendTracker: account already set to requested state" ); excludedFromDividends[account] = excluded; if (excluded) { _setBalance(account, 0); } else { uint256 newBalance = IERC20(tokenAddress).balanceOf(account); if (newBalance >= minTokenBalanceForDividends) { _setBalance(account, newBalance); } else { _setBalance(account, 0); } } emit ExcludeFromDividends(account, excluded); } function isExcludedFromDividends(address account) public view returns (bool) { return excludedFromDividends[account]; } function manualSendDividend(uint256 amount, address holder) external onlyOwner { uint256 contractETHBalance = address(this).balance; payable(holder).transfer(amount > 0 ? amount : contractETHBalance); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = _balances[account]; if (newBalance > currentBalance) { uint256 addAmount = newBalance - currentBalance; _mint(account, addAmount); } else if (newBalance < currentBalance) { uint256 subAmount = currentBalance - newBalance; _burn(account, subAmount); } } function _mint(address account, uint256 amount) private { require( account != address(0), "PLUTUS_DividendTracker: mint to the zero address" ); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] - int256(magnifiedDividendPerShare * amount); } function _burn(address account, uint256 amount) private { require( account != address(0), "PLUTUS_DividendTracker: burn from the zero address" ); uint256 accountBalance = _balances[account]; require( accountBalance >= amount, "PLUTUS_DividendTracker: burn amount exceeds balance" ); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account] + int256(magnifiedDividendPerShare * amount); } function processAccount(address payable account) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if (amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount); return true; } return false; } function _withdrawDividendOfUser(address payable account) private returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(account); if (_withdrawableDividend > 0) { withdrawnDividends[account] += _withdrawableDividend; totalDividendsWithdrawn += _withdrawableDividend; emit DividendWithdrawn(account, _withdrawableDividend); (bool success, ) = account.call{ value: _withdrawableDividend, gas: 3000 }(""); if (!success) { withdrawnDividends[account] -= _withdrawableDividend; totalDividendsWithdrawn -= _withdrawableDividend; return 0; } return _withdrawableDividend; } return 0; } function compoundAccount(address payable account) public onlyOwner returns (bool) { (uint256 amount, uint256 tokens) = _compoundDividendOfUser(account); if (amount > 0) { lastClaimTimes[account] = block.timestamp; emit Compound(account, amount, tokens); return true; } return false; } function _compoundDividendOfUser(address payable account) private returns (uint256, uint256) { IERC20 mainToken = IERC20(tokenAddress); uint256 _withdrawableDividend = withdrawableDividendOf(account); if (_withdrawableDividend > 0) { withdrawnDividends[account] += _withdrawableDividend; totalDividendsWithdrawn += _withdrawableDividend; emit DividendWithdrawn(account, _withdrawableDividend); IUniswapV2Router02 uniswapV2Router = IUniswapV2Router02( UNISWAPROUTER ); address[] memory path = new address[](2); path[0] = uniswapV2Router.WETH(); path[1] = address(tokenAddress); bool success; uint256 tokens; uint256 initTokenBal = mainToken.balanceOf(address(this)); try uniswapV2Router .swapExactETHForTokensSupportingFeeOnTransferTokens{ value: _withdrawableDividend }(0, path, address(this), block.timestamp) { success = true; tokens = mainToken.balanceOf(address(this)) - initTokenBal; success = mainToken.transfer(account, tokens); } catch Error( string memory /*err*/ ) { success = false; } if (!success) { withdrawnDividends[account] -= _withdrawableDividend; totalDividendsWithdrawn -= _withdrawableDividend; return (0, 0); } return (_withdrawableDividend, tokens); } return (0, 0); } function withdrawableDividendOf(address account) public view returns (uint256) { return accumulativeDividendOf(account) - withdrawnDividends[account]; } function withdrawnDividendOf(address account) public view returns (uint256) { return withdrawnDividends[account]; } function accumulativeDividendOf(address account) public view returns (uint256) { int256 a = int256(magnifiedDividendPerShare * balanceOf(account)); int256 b = magnifiedDividendCorrections[account]; // this is an explicit int256 (signed) return uint256(a + b) / magnitude; } function getAccountInfo(address account) public view returns ( address, uint256, uint256, uint256, uint256 ) { AccountInfo memory info; info.account = account; info.withdrawableDividends = withdrawableDividendOf(account); info.totalDividends = accumulativeDividendOf(account); info.lastClaimTime = lastClaimTimes[account]; return ( info.account, info.withdrawableDividends, info.totalDividends, info.lastClaimTime, totalDividendsWithdrawn ); } function getLastClaimTime(address account) public view returns (uint256) { return lastClaimTimes[account]; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public pure returns (uint8) { return 18; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address, uint256) public pure override returns (bool) { revert("PLUTUS_DividendTracker: method not implemented"); } function allowance(address, address) public pure override returns (uint256) { revert("PLUTUS_DividendTracker: method not implemented"); } function approve(address, uint256) public pure override returns (bool) { revert("PLUTUS_DividendTracker: method not implemented"); } function transferFrom( address, address, uint256 ) public pure override returns (bool) { revert("PLUTUS_DividendTracker: method not implemented"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"BlacklistEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"CompoundingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nativeReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndAddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TaxEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"_devTokenAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_dividendsTokenAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_dreamTokenAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityTokenAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_treasuryTokenAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"blacklist","type":"bool"}],"name":"blackList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"blackListMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compoundingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFeeBuyBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeSellBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendFeeBuyBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendFeeSellBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dreamFeeBuyBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dreamFeeSellBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dreamWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"includeToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeBuyBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeSellBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"holder","type":"address"}],"name":"manualSendDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwapAndSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTxBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setCompoundingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_devFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_liquidityFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_dividendFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_dreamFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_treasuryFeeSell","type":"uint256"},{"internalType":"uint256","name":"_devFeeSell","type":"uint256"},{"internalType":"uint256","name":"_liquidityFeeSell","type":"uint256"},{"internalType":"uint256","name":"_dividendFeeSell","type":"uint256"},{"internalType":"uint256","name":"_dreamFeeSell","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"setMaxTxBPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"setMaxWalletBPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setParametersToLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTaxEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setTradingOpenDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_treasuryWallet","type":"address"},{"internalType":"address payable","name":"_devWallet","type":"address"},{"internalType":"address payable","name":"_dreamWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"techSupportFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"techWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFeeBuyBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFeeSellBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_swapEnabled","type":"bool"},{"internalType":"uint256","name":"_swapTokensAtAmount","type":"uint256"},{"internalType":"bool","name":"_swapAllToken","type":"bool"}],"name":"updateDividendSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
600180546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560028054821661dead17905560038054909116905560c0604052601760808190527f504c55545553204341504954414c20484f4c44494e475300000000000000000060a09081526200007e916004919062000516565b50604080518082019091526003808252620a086960eb1b6020909201918252620000ab9160059162000516565b50610190600b556000600c556064600d5560c8600e5561012c600f5561025860105560c8601155606460125560646013556000601455600f54600e54600d54600c54600b54620000fc9190620005fc565b620001089190620005fc565b620001149190620005fc565b620001209190620005fc565b60155569152d02c7e14af68000006016556018805463ffffffff191663010101011790556c0c9f2c9cd04674edea40000000601955601a8054610100600160a81b031916748dc8d7b9de5d18c1afe34a9376f9c0bacb83e4ff00179055601b805473aa30f62195fc8015cee0ecfa4c392c7b166be6ce6001600160a01b031991821617909155601c8054736930f422b668496ed697aa41f3e6e324e6159718908316179055601d8054737b0138c49570f78d45a07fcecc11e70e605f33db9216919091179055603260285560c86029556109c4602a556367a4a77a602b553480156200020b57600080fd5b506200021733620004c6565b60015460405130916001600160a01b0316906200023490620005a5565b6001600160a01b03928316815291166020820152604001604051809103906000f08015801562000268573d6000803e3d6000fd5b50602580546001600160a01b0319166001600160a01b039283161790556001546040805163c45a015560e01b815290519190921691600091839163c45a0155916004808301926020929190829003018186803b158015620002c857600080fd5b505afa158015620002dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003039190620005ca565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200034c57600080fd5b505afa15801562000361573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003879190620005ca565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620003d057600080fd5b505af1158015620003e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200040b9190620005ca565b602680546001600160a01b038086166001600160a01b0319928316179092556027805492841692909116919091179055601954909150601e60006200044d3390565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546200047e9190620005fc565b909155505060195460405190815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505062000660565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620005249062000623565b90600052602060002090601f01602090048101928262000548576000855562000593565b82601f106200056357805160ff191683800117855562000593565b8280016001018555821562000593579182015b828111156200059357825182559160200191906001019062000576565b50620005a1929150620005b3565b5090565b611f018062003da383390190565b5b80821115620005a15760008155600101620005b4565b600060208284031215620005dd57600080fd5b81516001600160a01b0381168114620005f557600080fd5b9392505050565b600082198211156200061e57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200063857607f821691505b602082108114156200065a57634e487b7160e01b600052602260045260246000fd5b50919050565b61373380620006706000396000f3fe6080604052600436106104405760003560e01c806375cb1bd111610234578063aafd847a1161012e578063d4c989d3116100b6578063e9910b2b1161007a578063e9910b2b14610d10578063f2fde38b14610d26578063f5742d9714610d46578063f69e204614610d5c578063fee4675c14610d7157600080fd5b8063d4c989d314610c54578063dd62ed3e14610c74578063e01af92c14610cba578063e2f4560514610cda578063e4956ce214610cf057600080fd5b8063c3033aeb116100fd578063c3033aeb14610bbe578063c6af580b14610bde578063c705c56914610bfe578063c98139e614610c1e578063d2fcc00114610c3457600080fd5b8063aafd847a14610b48578063af7999cd14610b68578063bd48460614610b7e578063c024666814610b9e57600080fd5b8063952e53b8116101bc578063a68fe71a11610180578063a68fe71a14610aa8578063a8b9d24014610ac8578063a9059cbb14610ae8578063a92a64e214610b08578063aa4e8c4a14610b2857600080fd5b8063952e53b814610a1d57806395d89b4114610a335780639c8e841d14610a48578063a457c2d714610a68578063a680e0bc14610a8857600080fd5b8063870bd30b11610203578063870bd30b1461097a5780638da5cb5b1461099a5780638e126944146109b85780638ea5220f146109d8578063902cda77146109fd57600080fd5b806375cb1bd1146108dc578063769758e5146108fc5780637b510fe8146109125780638121a1eb1461096457600080fd5b8063395093511161034557806358f4bea1116102cd5780636ddd1713116102915780636ddd17131461084657806370a0823114610865578063715018a61461089b578063737718dd146108b0578063744d1591146108c657600080fd5b806358f4bea11461077e5780635e843ad214610794578063658c27a9146107b457806368c51e35146107ed5780636dd3d39f1461080d57600080fd5b806349bd5a5e1161031457806349bd5a5e146106e65780634e71d92d146107065780634fbee1931461071b57806357777d311461075357806358076c571461076957600080fd5b8063395093511461067b5780633ee0ce021461069b57806340225fce146106b05780634626402b146106c657600080fd5b806323b872dd116103c85780632c1f5216116103975780632c1f5216146105f25780632f4504ae1461061257806330a1b44b14610633578063313ce5671461064957806337eb15281461066557600080fd5b806323b872dd1461058657806323edbb08146105a6578063244ea525146105bc57806327ce0147146105d257600080fd5b80630dd871571161040f5780630dd87157146104e95780631694505e1461050d57806318160ddd1461054557806322139ec21461055a578063225e5eb71461057057600080fd5b80630483f7a01461044c57806306fdde031461046e578063095ea7b3146104995780630b6bb6f5146104c957600080fd5b3661044757005b600080fd5b34801561045857600080fd5b5061046c610467366004613108565b610d87565b005b34801561047a57600080fd5b50610483610e25565b60405161049091906133d5565b60405180910390f35b3480156104a557600080fd5b506104b96104b4366004613136565b610eb7565b6040519015158152602001610490565b3480156104d557600080fd5b5061046c6104e43660046131ab565b610ecd565b3480156104f557600080fd5b506104ff60175481565b604051908152602001610490565b34801561051957600080fd5b5060265461052d906001600160a01b031681565b6040516001600160a01b039091168152602001610490565b34801561055157600080fd5b506019546104ff565b34801561056657600080fd5b506104ff600d5481565b34801561057c57600080fd5b506104ff60135481565b34801561059257600080fd5b506104b96105a13660046130c7565b610f69565b3480156105b257600080fd5b506104ff60105481565b3480156105c857600080fd5b506104ff602a5481565b3480156105de57600080fd5b506104ff6105ed366004613002565b61101b565b3480156105fe57600080fd5b5060255461052d906001600160a01b031681565b34801561061e57600080fd5b506018546104b9906301000000900460ff1681565b34801561063f57600080fd5b506104ff60065481565b34801561065557600080fd5b5060405160128152602001610490565b34801561067157600080fd5b506104ff60155481565b34801561068757600080fd5b506104b9610696366004613136565b6110a0565b3480156106a757600080fd5b5061046c6110d7565b3480156106bc57600080fd5b506104ff60145481565b3480156106d257600080fd5b50601b5461052d906001600160a01b031681565b3480156106f257600080fd5b5060275461052d906001600160a01b031681565b34801561071257600080fd5b5061046c61113c565b34801561072757600080fd5b506104b9610736366004613002565b6001600160a01b0316600090815260208052604090205460ff1690565b34801561075f57600080fd5b506104ff60285481565b34801561077557600080fd5b5061046c6111cb565b34801561078a57600080fd5b506104ff60125481565b3480156107a057600080fd5b5061046c6107af3660046132b1565b6112b1565b3480156107c057600080fd5b506104b96107cf366004613002565b6001600160a01b031660009081526023602052604090205460ff1690565b3480156107f957600080fd5b5061046c6108083660046132e8565b611309565b34801561081957600080fd5b506104b9610828366004613002565b6001600160a01b031660009081526024602052604090205460ff1690565b34801561085257600080fd5b506018546104b990610100900460ff1681565b34801561087157600080fd5b506104ff610880366004613002565b6001600160a01b03166000908152601e602052604090205490565b3480156108a757600080fd5b5061046c611338565b3480156108bc57600080fd5b506104ff60115481565b3480156108d257600080fd5b506104ff60295481565b3480156108e857600080fd5b5061046c6108f7366004613043565b61136c565b34801561090857600080fd5b506104ff600a5481565b34801561091e57600080fd5b5061093261092d366004613002565b6113e3565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610490565b34801561097057600080fd5b506104ff60085481565b34801561098657600080fd5b506018546104b99062010000900460ff1681565b3480156109a657600080fd5b506000546001600160a01b031661052d565b3480156109c457600080fd5b5061046c6109d336600461331a565b61147c565b3480156109e457600080fd5b50601a5461052d9061010090046001600160a01b031681565b348015610a0957600080fd5b50601c5461052d906001600160a01b031681565b348015610a2957600080fd5b506104ff600b5481565b348015610a3f57600080fd5b506104836114df565b348015610a5457600080fd5b5061046c610a63366004613108565b6114ee565b348015610a7457600080fd5b506104b9610a83366004613136565b6115ac565b348015610a9457600080fd5b506104ff610aa3366004613002565b611648565b348015610ab457600080fd5b5061046c610ac33660046132e8565b61167b565b348015610ad457600080fd5b506104ff610ae3366004613002565b6116aa565b348015610af457600080fd5b506104b9610b03366004613136565b6116dd565b348015610b1457600080fd5b5061046c610b2336600461336d565b6116ea565b348015610b3457600080fd5b5061046c610b433660046132e8565b611780565b348015610b5457600080fd5b506104ff610b63366004613002565b6117af565b348015610b7457600080fd5b506104ff600e5481565b348015610b8a57600080fd5b50601d5461052d906001600160a01b031681565b348015610baa57600080fd5b5061046c610bb9366004613108565b6117e2565b348015610bca57600080fd5b5061046c610bd93660046131ab565b6118f1565b348015610bea57600080fd5b5061046c610bf9366004613277565b611989565b348015610c0a57600080fd5b506104b9610c19366004613002565b611a09565b348015610c2a57600080fd5b506104ff60095481565b348015610c4057600080fd5b5061046c610c4f366004613108565b611a87565b348015610c6057600080fd5b5061046c610c6f366004613108565b611adc565b348015610c8057600080fd5b506104ff610c8f36600461308e565b6001600160a01b039182166000908152601f6020908152604080832093909416825291909152205490565b348015610cc657600080fd5b5061046c610cd5366004613277565b611b31565b348015610ce657600080fd5b506104ff60165481565b348015610cfc57600080fd5b5061046c610d0b366004613277565b611ba4565b348015610d1c57600080fd5b506104ff600f5481565b348015610d3257600080fd5b5061046c610d41366004613002565b611c1b565b348015610d5257600080fd5b506104ff600c5481565b348015610d6857600080fd5b5061046c611cb3565b348015610d7d57600080fd5b506104ff60075481565b6000546001600160a01b03163314610dba5760405162461bcd60e51b8152600401610db190613527565b60405180910390fd5b60255460405162241fbd60e51b81526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b158015610e0957600080fd5b505af1158015610e1d573d6000803e3d6000fd5b505050505050565b606060048054610e349061363d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e609061363d565b8015610ead5780601f10610e8257610100808354040283529160200191610ead565b820191906000526020600020905b815481529060010190602001808311610e9057829003601f168201915b5050505050905090565b6000610ec4338484611d2e565b50600192915050565b6000546001600160a01b03163314610ef75760405162461bcd60e51b8152600401610db190613527565b60005b81518160ff161015610f6557600160216000848460ff1681518110610f2157610f216136ae565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f5d81613678565b915050610efa565b5050565b6000610f76848484611e55565b6001600160a01b0384166000908152601f6020908152604080832033845290915290205482811015610ffc5760405162461bcd60e51b815260206004820152602960248201527f504c555455533a207472616e7366657220616d6f756e74206578636565647320604482015268616c6c6f77616e636560b81b6064820152608401610db1565b611010853361100b8685613626565b611d2e565b506001949350505050565b6025546040516327ce014760e01b81526001600160a01b03838116600483015260009216906327ce0147906024015b60206040518083038186803b15801561106257600080fd5b505afa158015611076573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109a9190613301565b92915050565b336000818152601f602090815260408083206001600160a01b03871684529091528120549091610ec491859061100b9086906135cd565b6000546001600160a01b031633146111015760405162461bcd60e51b8152600401610db190613527565b306000908152601e6020526040902054601854479060ff16158015611127575060165482115b156111325760165491505b610f6582826126ab565b6025546001600160a01b031663807ab4f7335b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381600087803b15801561119057600080fd5b505af11580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190613294565b50565b6000546001600160a01b031633146111f55760405162461bcd60e51b8152600401610db190613527565b61121161120a6000546001600160a01b031690565b60016117e2565b61121c3060016117e2565b602554611233906001600160a01b031660016117e2565b61124f6112486000546001600160a01b031690565b6001611adc565b61125a306001611adc565b602554611271906001600160a01b03166001611adc565b61128d6112866000546001600160a01b031690565b6001611a87565b611298306001611a87565b6025546112af906001600160a01b03166001611a87565b565b6000546001600160a01b031633146112db5760405162461bcd60e51b8152600401610db190613527565b6018805460169390935590151560ff19931515610100029390931661ffff1990921691909117919091179055565b6000546001600160a01b031633146113335760405162461bcd60e51b8152600401610db190613527565b602955565b6000546001600160a01b031633146113625760405162461bcd60e51b8152600401610db190613527565b6112af6000612c90565b6000546001600160a01b031633146113965760405162461bcd60e51b8152600401610db190613527565b601b80546001600160a01b039485166001600160a01b031991821617909155601a805493851661010002610100600160a81b031990941693909317909255601c8054919093169116179055565b602554604051630f6a21fd60e31b81526001600160a01b0383811660048301526000928392839283928392911690637b510fe89060240160a06040518083038186803b15801561143257600080fd5b505afa158015611446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146a9190613162565b939a9299509097509550909350915050565b6000546001600160a01b031633146114a65760405162461bcd60e51b8152600401610db190613527565b6025546040516323849a5160e21b8152600481018490526001600160a01b03838116602483015290911690638e12694490604401610def565b606060058054610e349061363d565b6000546001600160a01b031633146115185760405162461bcd60e51b8152600401610db190613527565b6001600160a01b03821660009081526022602052604090205460ff16156115815760405162461bcd60e51b815260206004820152601860248201527f7573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610db1565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b336000908152601f602090815260408083206001600160a01b03861684529091528120548281101561162f5760405162461bcd60e51b815260206004820152602660248201527f504c555455533a2064656372656173656420616c6c6f77616e63652062656c6f60448201526577207a65726f60d01b6064820152608401610db1565b61163e338561100b8685613626565b5060019392505050565b6025546040516329a0382f60e21b81526001600160a01b038381166004830152600092169063a680e0bc9060240161104a565b6000546001600160a01b031633146116a55760405162461bcd60e51b8152600401610db190613527565b602b55565b6025546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161104a565b6000610ec4338484611e55565b6000546001600160a01b031633146117145760405162461bcd60e51b8152600401610db190613527565b600b8a9055600c869055600d899055600e889055600f879055601085905560118190556012849055601383905560148290558589886117538b8e6135cd565b61175d91906135cd565b61176791906135cd565b61177191906135cd565b60155550505050505050505050565b6000546001600160a01b031633146117aa5760405162461bcd60e51b8152600401610db190613527565b602855565b60255460405163557ec23d60e11b81526001600160a01b038381166004830152600092169063aafd847a9060240161104a565b6000546001600160a01b0316331461180c5760405162461bcd60e51b8152600401610db190613527565b6001600160a01b038216600090815260208052604090205460ff16151581151514156118945760405162461bcd60e51b815260206004820152603160248201527f504c555455533a206163636f756e7420697320616c72656164792073657420746044820152706f2072657175657374656420737461746560781b6064820152608401610db1565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b0316331461191b5760405162461bcd60e51b8152600401610db190613527565b60005b81518160ff161015610f6557600160226000848460ff1681518110611945576119456136ae565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061198181613678565b91505061191e565b6000546001600160a01b031633146119b35760405162461bcd60e51b8152600401610db190613527565b60188054821515620100000262ff0000199091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe133906119fe90831515815260200190565b60405180910390a150565b60255460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c5699060240160206040518083038186803b158015611a4f57600080fd5b505afa158015611a63573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109a9190613294565b6000546001600160a01b03163314611ab15760405162461bcd60e51b8152600401610db190613527565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611b065760405162461bcd60e51b8152600401610db190613527565b6001600160a01b03919091166000908152602360205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611b5b5760405162461bcd60e51b8152600401610db190613527565b601880548215156101000261ff00199091161790556040517fb9bbb15e341600c8d067a0cadeba219905d5ba6d422b193c9c32265d26fc51c8906119fe90831515815260200190565b6000546001600160a01b03163314611bce5760405162461bcd60e51b8152600401610db190613527565b6018805482151563010000000263ff000000199091161790556040517f341322866a3a2c26c27efa4c270c5ba86f6963257118897dd8196f224c002d43906119fe90831515815260200190565b6000546001600160a01b03163314611c455760405162461bcd60e51b8152600401610db190613527565b6001600160a01b038116611caa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610db1565b6111c881612c90565b6018546301000000900460ff16611d175760405162461bcd60e51b815260206004820152602260248201527f504c555455533a20636f6d706f756e64696e67206973206e6f7420656e61626c604482015261195960f21b6064820152608401610db1565b6025546001600160a01b0316636de1a5a93361114f565b6001600160a01b038316611d925760405162461bcd60e51b815260206004820152602560248201527f504c555455533a20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610db1565b6001600160a01b038216611df45760405162461bcd60e51b815260206004820152602360248201527f504c555455533a20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610db1565b6001600160a01b038381166000818152601f602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b42602b541080611e7257506000546001600160a01b038481169116145b80611e8a57506000546001600160a01b038381169116145b80611ead57506001600160a01b03831660009081526021602052604090205460ff165b80611ed057506001600160a01b03821660009081526021602052604090205460ff165b611f1c5760405162461bcd60e51b815260206004820181905260248201527f504c555455533a20546f6b656e2069736e2774207472616461626c65207965746044820152606401610db1565b6001600160a01b03831660009081526022602052604090205460ff1615611f855760405162461bcd60e51b815260206004820152601d60248201527f504c555455533a2053656e64657220697320626c61636b6c69737465640000006044820152606401610db1565b6001600160a01b03821660009081526022602052604090205460ff1615611fee5760405162461bcd60e51b815260206004820181905260248201527f504c555455533a20526563697069656e7420697320626c61636b6c69737465646044820152606401610db1565b6001600160a01b0383166120145760405162461bcd60e51b8152600401610db19061342a565b6001600160a01b03821661203a5760405162461bcd60e51b8152600401610db19061349c565b600061271060285461204b60195490565b6120559190613607565b61205f91906135e5565b9050600061271060295461207260195490565b61207c9190613607565b61208691906135e5565b905081831115806120af57506001600160a01b03851660009081526023602052604090205460ff165b6120ef5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610db1565b6000546001600160a01b0386811691161480159061211657506001600160a01b0384163014155b801561213057506002546001600160a01b03858116911614155b801561214a57506027546001600160a01b03858116911614155b15612196576001600160a01b0384166000908152601e602090815260408083205460249092529091205460ff168061218b57508161218885836135cd565b11155b61219457600080fd5b505b6001600160a01b0385166000908152601e6020526040902054838110156121cf5760405162461bcd60e51b8152600401610db1906134e0565b306000908152601e6020526040902054601654601854479183101590610100900460ff1680156121fc5750805b801561220b5750601a5460ff16155b801561222557506026546001600160a01b038a8116911614155b801561223f57506000546001600160a01b038a8116911614155b801561225957506000546001600160a01b03898116911614155b156122a357601a805460ff1916600117905560185460ff1615801561227f575060165483115b1561228a5760165492505b61229483836126ab565b42601755601a805460ff191690555b6027546000906001600160a01b038b811691161480156122d157506026546001600160a01b038a8116911614155b8061230257506027546001600160a01b038a8116911614801561230257506026546001600160a01b038b8116911614155b1561230b575060015b6001600160a01b038a16600090815260208052604090205460ff168061234857506001600160a01b038916600090815260208052604090205460ff165b15612351575060005b601a5460ff168061236b575060185462010000900460ff16155b15612374575060005b8015612574576027546001600160a01b038b81169116141561245b57600f54600e54600d54600c54600b546123a991906135cd565b6123b391906135cd565b6123bd91906135cd565b6123c791906135cd565b6015819055600d546123d9908a613607565b6123e391906135e5565b600655601554600c546123f6908a613607565b61240091906135e5565b600755601554600b54612413908a613607565b61241d91906135e5565b600855601554600e54612430908a613607565b61243a91906135e5565b600955601554600f5461244d908a613607565b61245791906135e5565b600a555b6027546001600160a01b038a81169116141561253c5760145460135460125460115460105461248a91906135cd565b61249491906135cd565b61249e91906135cd565b6124a891906135cd565b60158190556012546124ba908a613607565b6124c491906135e5565b6006556015546011546124d7908a613607565b6124e191906135e5565b6007556015546010546124f4908a613607565b6124fe91906135e5565b600855601554601354612511908a613607565b61251b91906135e5565b60095560155460145461252e908a613607565b61253891906135e5565b600a555b60006127106015548a61254f9190613607565b61255991906135e5565b9050612565818a613626565b98506125728b3083612ce0565b505b61257f8a8a8a612ce0565b6025546001600160a01b031663e30443bc8b6125b0816001600160a01b03166000908152601e602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156125f657600080fd5b505af115801561260a573d6000803e3d6000fd5b50506025546001600160a01b0316915063e30443bc90508a612641816001600160a01b03166000908152601e602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561268757600080fd5b505af115801561269b573d6000803e3d6000fd5b5050505050505050505050505050565b600082116126b7575050565b6000600a546009546006546007546008546126d291906135cd565b6126dc91906135cd565b6126e691906135cd565b6126f091906135cd565b601b549091506000906001600160a01b0316156127235781600854856127169190613607565b61272091906135e5565b90505b601a5460009061010090046001600160a01b03161561275857826006548661274b9190613607565b61275591906135e5565b90505b600080602560009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127a957600080fd5b505afa1580156127bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e19190613301565b11156128035783600a54876127f69190613607565b61280091906135e5565b90505b601c546000906001600160a01b0316156128335784600754886128269190613607565b61283091906135e5565b90505b6000818385612842888c613626565b61284c9190613626565b6128569190613626565b6128609190613626565b9050600061286f6002836135e5565b9050600061287d8284613626565b9050600082858761288e8a8c6135cd565b61289891906135cd565b6128a291906135cd565b6128ac91906135cd565b9050476128b882612dff565b60008b6128c58347613626565b6128cf91906135cd565b90506000836128de8c84613607565b6128e891906135e5565b90506000846128f78c85613607565b61290191906135e5565b90506000856129108c86613607565b61291a91906135e5565b90506000866129298c87613607565b61293391906135e5565b90506000818385612944888a613626565b61294e9190613626565b6129589190613626565b6129629190613626565b905084156129df57601b546040516000916001600160a01b03169087908381818185875af1925050503d80600081146129b7576040519150601f19603f3d011682016040523d82523d6000602084013e6129bc565b606091505b50509050806129dd5760405162461bcd60e51b8152600401610db190613470565b505b8315612aff576000612710602a54866129f89190613607565b612a0291906135e5565b601a5490915060009061010090046001600160a01b0316612a238388613626565b604051600081818185875af1925050503d8060008114612a5f576040519150601f19603f3d011682016040523d82523d6000602084013e612a64565b606091505b5050601d546040519192506000916001600160a01b039091169084908381818185875af1925050503d8060008114612ab8576040519150601f19603f3d011682016040523d82523d6000602084013e612abd565b606091505b5050905081612ade5760405162461bcd60e51b8152600401610db190613470565b80612afb5760405162461bcd60e51b8152600401610db190613470565b5050505b8115612b7a57601c546040516000916001600160a01b03169084908381818185875af1925050503d8060008114612b52576040519150601f19603f3d011682016040523d82523d6000602084013e612b57565b606091505b5050905080612b785760405162461bcd60e51b8152600401610db190613470565b505b612b848982612f32565b604080518b8152602081018390529081018a90527fb63dc6f50047533abe2d6adf180d38d524c8d98e55ad199aac8d6b9801bbe24a9060600160405180910390a18215612c63576025546040516000916001600160a01b03169085908381818185875af1925050503d8060008114612c18576040519150601f19603f3d011682016040523d82523d6000602084013e612c1d565b606091505b505090508015612c6157604080518f8152602081018690527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a15b505b505060006006819055600781905560088190556009819055600a5550505050505050505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316612d065760405162461bcd60e51b8152600401610db19061342a565b6001600160a01b038216612d2c5760405162461bcd60e51b8152600401610db19061349c565b6001600160a01b0383166000908152601e602052604090205481811015612d655760405162461bcd60e51b8152600401610db1906134e0565b612d6f8282613626565b6001600160a01b038086166000908152601e60205260408082209390935590851681529081208054849290612da59084906135cd565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612df191815260200190565b60405180910390a350505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612e3457612e346136ae565b6001600160a01b03928316602091820292909201810191909152602654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612e8857600080fd5b505afa158015612e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec09190613026565b81600181518110612ed357612ed36136ae565b6001600160a01b039283166020918202929092010152602654612ef99130911684611d2e565b60265460405163791ac94760e01b81526001600160a01b039091169063791ac94790610def90859060009086903090429060040161355c565b602654612f4a9030906001600160a01b031684611d2e565b60265460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b158015612fb257600080fd5b505af1158015612fc6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612feb919061333f565b5050505050565b8035612ffd816136da565b919050565b60006020828403121561301457600080fd5b813561301f816136da565b9392505050565b60006020828403121561303857600080fd5b815161301f816136da565b60008060006060848603121561305857600080fd5b8335613063816136da565b92506020840135613073816136da565b91506040840135613083816136da565b809150509250925092565b600080604083850312156130a157600080fd5b82356130ac816136da565b915060208301356130bc816136da565b809150509250929050565b6000806000606084860312156130dc57600080fd5b83356130e7816136da565b925060208401356130f7816136da565b929592945050506040919091013590565b6000806040838503121561311b57600080fd5b8235613126816136da565b915060208301356130bc816136ef565b6000806040838503121561314957600080fd5b8235613154816136da565b946020939093013593505050565b600080600080600060a0868803121561317a57600080fd5b8551613185816136da565b602087015160408801516060890151608090990151929a91995097965090945092505050565b600060208083850312156131be57600080fd5b823567ffffffffffffffff808211156131d657600080fd5b818501915085601f8301126131ea57600080fd5b8135818111156131fc576131fc6136c4565b8060051b604051601f19603f83011681018181108582111715613221576132216136c4565b604052828152858101935084860182860187018a101561324057600080fd5b600095505b8386101561326a5761325681612ff2565b855260019590950194938601938601613245565b5098975050505050505050565b60006020828403121561328957600080fd5b813561301f816136ef565b6000602082840312156132a657600080fd5b815161301f816136ef565b6000806000606084860312156132c657600080fd5b83356132d1816136ef565b9250602084013591506040840135613083816136ef565b6000602082840312156132fa57600080fd5b5035919050565b60006020828403121561331357600080fd5b5051919050565b6000806040838503121561332d57600080fd5b8235915060208301356130bc816136da565b60008060006060848603121561335457600080fd5b8351925060208401519150604084015190509250925092565b6000806000806000806000806000806101408b8d03121561338d57600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600060208083528351808285015260005b81811015613402578581018301518582016040015282016133e6565b81811115613414576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526026908201527f504c555455533a207472616e736665722066726f6d20746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526012908201527128262aaa2aa99d102a3c103330b4b632b21760711b604082015260600190565b60208082526024908201527f504c555455533a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526027908201527f504c555455533a207472616e7366657220616d6f756e7420657863656564732060408201526662616c616e636560c81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156135ac5784516001600160a01b031683529383019391830191600101613587565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156135e0576135e0613698565b500190565b60008261360257634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561362157613621613698565b500290565b60008282101561363857613638613698565b500390565b600181811c9082168061365157607f821691505b6020821081141561367257634e487b7160e01b600052602260045260246000fd5b50919050565b600060ff821660ff81141561368f5761368f613698565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146111c857600080fd5b80151581146111c857600080fdfea2646970667358221220c0685054a3cea0b196dd317f3dda813ed78d2a81749f333dd455fc28cff13a5564736f6c6343000807003360e0604052601660a08190527f504c555455535f4469766964656e64547261636b65720000000000000000000060c090815262000040916002919062000153565b506040805180820190915260168082527f504c555455535f4469766964656e64547261636b6572000000000000000000006020909201918252620000879160039162000153565b503480156200009557600080fd5b5060405162001f0138038062001f01833981016040819052620000b89162000216565b620000c33362000103565b69021e19e0c9bab2400000608052600a80546001600160a01b039384166001600160a01b031991821617909155600180549290931691161790556200028b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000161906200024e565b90600052602060002090601f016020900481019282620001855760008555620001d0565b82601f10620001a057805160ff1916838001178555620001d0565b82800160010185558215620001d0579182015b82811115620001d0578251825591602001919060010190620001b3565b50620001de929150620001e2565b5090565b5b80821115620001de5760008155600101620001e3565b80516001600160a01b03811681146200021157600080fd5b919050565b600080604083850312156200022a57600080fd5b6200023583620001f9565b91506200024560208401620001f9565b90509250929050565b600181811c908216806200026357607f821691505b602082108114156200028557634e487b7160e01b600052602260045260246000fd5b50919050565b608051611c4c620002b5600039600081816105520152818161081e0152610d310152611c4c6000f3fe6080604052600436106101d15760003560e01c806385a6b3ae116100f7578063a8b9d24011610095578063c705c56911610064578063c705c56914610574578063dd62ed3e146105ad578063e30443bc146105c8578063f2fde38b146105e857600080fd5b8063a8b9d240146104ea578063a9059cbb14610238578063aafd847a1461050a578063c49af5f01461054057600080fd5b806395d89b41116100d157806395d89b41146104695780639d76ea581461047e5780639e1e06611461049e578063a680e0bc146104b457600080fd5b806385a6b3ae146104015780638da5cb5b146104175780638e1269441461044957600080fd5b80633009a6091161016f57806370a082311161013e57806370a0823114610344578063715018a61461037a5780637b510fe81461038f578063807ab4f7146103e157600080fd5b80633009a609146102c2578063313ce567146102d85780634e7b827f146102f45780636de1a5a91461032457600080fd5b8063095ea7b3116101ab578063095ea7b31461023857806318160ddd1461026857806323b872dd1461028757806327ce0147146102a257600080fd5b806303c83302146101e55780630483f7a0146101ed57806306fdde031461020d57600080fd5b366101e0576101de610608565b005b600080fd5b6101de610608565b3480156101f957600080fd5b506101de61020836600461183e565b610697565b34801561021957600080fd5b506102226108a8565b60405161022f9190611931565b60405180910390f35b34801561024457600080fd5b50610258610253366004611798565b61093a565b604051901515815260200161022f565b34801561027457600080fd5b506005545b60405190815260200161022f565b34801561029357600080fd5b506102586102533660046117fd565b3480156102ae57600080fd5b506102796102bd366004611757565b61099c565b3480156102ce57600080fd5b5061027960045481565b3480156102e457600080fd5b506040516012815260200161022f565b34801561030057600080fd5b5061025861030f366004611757565b600b6020526000908152604090205460ff1681565b34801561033057600080fd5b5061025861033f366004611757565b610a00565b34801561035057600080fd5b5061027961035f366004611757565b6001600160a01b031660009081526006602052604090205490565b34801561038657600080fd5b506101de610aab565b34801561039b57600080fd5b506103af6103aa366004611757565b610adf565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a00161022f565b3480156103ed57600080fd5b506102586103fc366004611757565b610b87565b34801561040d57600080fd5b5061027960085481565b34801561042357600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161022f565b34801561045557600080fd5b506101de6104643660046118a2565b610c2c565b34801561047557600080fd5b50610222610c9f565b34801561048a57600080fd5b50600a54610431906001600160a01b031681565b3480156104aa57600080fd5b5061027960095481565b3480156104c057600080fd5b506102796104cf366004611757565b6001600160a01b03166000908152600e602052604090205490565b3480156104f657600080fd5b50610279610505366004611757565b610cae565b34801561051657600080fd5b50610279610525366004611757565b6001600160a01b03166000908152600d602052604090205490565b34801561054c57600080fd5b506102797f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b5061025861058f366004611757565b6001600160a01b03166000908152600b602052604090205460ff1690565b3480156105b957600080fd5b506102796102533660046117c4565b3480156105d457600080fd5b506101de6105e3366004611798565b610ce0565b3480156105f457600080fd5b506101de610603366004611757565b610d6f565b60006005541161061757600080fd5b34156106955760055461062e600160801b34611a36565b6106389190611a14565b60075461064591906119fc565b60075560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2346008600082825461068f91906119fc565b90915550505b565b6000546001600160a01b031633146106ca5760405162461bcd60e51b81526004016106c190611986565b60405180910390fd5b6001600160a01b0382166000908152600b602052604090205460ff161515811515141561075f5760405162461bcd60e51b815260206004820152603e60248201527f504c555455535f4469766964656e64547261636b65723a206163636f756e742060448201527f616c72656164792073657420746f20726571756573746564207374617465000060648201526084016106c1565b6001600160a01b0382166000908152600b60205260409020805460ff1916821580159190911790915561079c57610797826000610e0a565b61085f565b600a546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b1580156107e257600080fd5b505afa1580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190611889565b90507f000000000000000000000000000000000000000000000000000000000000000081106108525761084d8382610e0a565b61085d565b61085d836000610e0a565b505b816001600160a01b03167fa3c7c11b2e12c4144b09a7813f3393ba646392788638998c97be8da908cf04be8260405161089c911515815260200190565b60405180910390a25050565b6060600280546108b790611aab565b80601f01602080910402602001604051908101604052809291908181526020018280546108e390611aab565b80156109305780601f1061090557610100808354040283529160200191610930565b820191906000526020600020905b81548152906001019060200180831161091357829003601f168201915b5050505050905090565b60405162461bcd60e51b815260206004820152602e60248201527f504c555455535f4469766964656e64547261636b65723a206d6574686f64206e60448201526d1bdd081a5b5c1b195b595b9d195960921b60648201526000906084016106c1565b6001600160a01b03811660009081526006602052604081205460075482916109c391611a36565b6001600160a01b0384166000908152600c6020526040902054909150600160801b6109ee82846119bb565b6109f89190611a14565b949350505050565b600080546001600160a01b03163314610a2b5760405162461bcd60e51b81526004016106c190611986565b600080610a3784610e68565b90925090508115610aa1576001600160a01b0384166000818152600e602090815260409182902042905581518581529081018490527f0e311a2c6dbfb0153ec3a8a5bdca09070b3e5f60768fdc10a20453f38d186873910160405180910390a25060019392505050565b5060009392505050565b6000546001600160a01b03163314610ad55760405162461bcd60e51b81526004016106c190611986565b61069560006112ad565b6000806000806000610b1b604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b6001600160a01b0387168152610b3087610cae565b6020820152610b3e8761099c565b60408281019182526001600160a01b03989098166000908152600e6020908152989020546060830181905282519890920151905160095498999198909750919550909350915050565b600080546001600160a01b03163314610bb25760405162461bcd60e51b81526004016106c190611986565b6000610bbd836112fd565b90508015610c23576001600160a01b0383166000818152600e602052604090819020429055517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d490610c129084815260200190565b60405180910390a250600192915050565b50600092915050565b6000546001600160a01b03163314610c565760405162461bcd60e51b81526004016106c190611986565b476001600160a01b0382166108fc84610c6f5782610c71565b845b6040518115909202916000818181858888f19350505050158015610c99573d6000803e3d6000fd5b50505050565b6060600380546108b790611aab565b6001600160a01b0381166000908152600d6020526040812054610cd08361099c565b610cda9190611a94565b92915050565b6000546001600160a01b03163314610d0a5760405162461bcd60e51b81526004016106c190611986565b6001600160a01b0382166000908152600b602052604090205460ff1615610d2f575050565b7f00000000000000000000000000000000000000000000000000000000000000008110610d6457610d608282610e0a565b5050565b610d60826000610e0a565b6000546001600160a01b03163314610d995760405162461bcd60e51b81526004016106c190611986565b6001600160a01b038116610dfe5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c1565b610e07816112ad565b50565b6001600160a01b03821660009081526006602052604090205480821115610e43576000610e378284611a94565b9050610c99848261144c565b80821015610e63576000610e578383611a94565b9050610c998482611591565b505050565b600a5460009081906001600160a01b031681610e8385610cae565b905080156112a0576001600160a01b0385166000908152600d602052604081208054839290610eb39084906119fc565b925050819055508060096000828254610ecc91906119fc565b90915550506040518181526001600160a01b038616907fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9060200160405180910390a26001546040805160028082526060820183526001600160a01b0390931692600092602083019080368337019050509050816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610f7857600080fd5b505afa158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb0919061177b565b81600081518110610fc357610fc3611b37565b6001600160a01b039283166020918202929092010152600a54825191169082906001908110610ff457610ff4611b37565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b8152306004820152600091829182918816906370a082319060240160206040518083038186803b15801561104857600080fd5b505afa15801561105c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110809190611889565b9050846001600160a01b031663b6f9de958760008730426040518663ffffffff1660e01b81526004016110b694939291906118c7565b6000604051808303818588803b1580156110cf57600080fd5b505af1935050505080156110e1575060015b611123576110ed611b4d565b806308c379a014156111175750611102611b69565b8061110d5750611119565b6000935050611233565b505b3d6000803e3d6000fd5b6040516370a0823160e01b81523060048201526001935081906001600160a01b038916906370a082319060240160206040518083038186803b15801561116857600080fd5b505afa15801561117c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a09190611889565b6111aa9190611a94565b60405163a9059cbb60e01b81526001600160a01b038c81166004830152602482018390529193509088169063a9059cbb90604401602060405180830381600087803b1580156111f857600080fd5b505af115801561120c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611230919061186c565b92505b82611290576001600160a01b038a166000908152600d602052604081208054889290611260908490611a94565b9250508190555085600960008282546112799190611a94565b9091555060009b8c9b509950505050505050505050565b5093989397509295505050505050565b5060009485945092505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008061130983610cae565b90508015610c23576001600160a01b0383166000908152600d6020526040812080548392906113399084906119fc565b92505081905550806009600082825461135291906119fc565b90915550506040518181526001600160a01b038416907fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9060200160405180910390a26000836001600160a01b031682610bb890604051600060405180830381858888f193505050503d80600081146113e7576040519150601f19603f3d011682016040523d82523d6000602084013e6113ec565b606091505b5050905080611445576001600160a01b0384166000908152600d60205260408120805484929061141d908490611a94565b9250508190555081600960008282546114369190611a94565b90915550600095945050505050565b5092915050565b6001600160a01b0382166114bb5760405162461bcd60e51b815260206004820152603060248201527f504c555455535f4469766964656e64547261636b65723a206d696e7420746f2060448201526f746865207a65726f206164647265737360801b60648201526084016106c1565b80600560008282546114cd91906119fc565b90915550506001600160a01b038216600090815260066020526040812080548392906114fa9084906119fc565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a38060075461154e9190611a36565b6001600160a01b0383166000908152600c60205260409020546115719190611a55565b6001600160a01b039092166000908152600c602052604090209190915550565b6001600160a01b0382166116025760405162461bcd60e51b815260206004820152603260248201527f504c555455535f4469766964656e64547261636b65723a206275726e2066726f6044820152716d20746865207a65726f206164647265737360701b60648201526084016106c1565b6001600160a01b038216600090815260066020526040902054818110156116875760405162461bcd60e51b815260206004820152603360248201527f504c555455535f4469766964656e64547261636b65723a206275726e20616d6f604482015272756e7420657863656564732062616c616e636560681b60648201526084016106c1565b6116918282611a94565b6001600160a01b038416600090815260066020526040812091909155600580548492906116bf908490611a94565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3816007546117139190611a36565b6001600160a01b0384166000908152600c602052604090205461173691906119bb565b6001600160a01b039093166000908152600c60205260409020929092555050565b60006020828403121561176957600080fd5b813561177481611bf3565b9392505050565b60006020828403121561178d57600080fd5b815161177481611bf3565b600080604083850312156117ab57600080fd5b82356117b681611bf3565b946020939093013593505050565b600080604083850312156117d757600080fd5b82356117e281611bf3565b915060208301356117f281611bf3565b809150509250929050565b60008060006060848603121561181257600080fd5b833561181d81611bf3565b9250602084013561182d81611bf3565b929592945050506040919091013590565b6000806040838503121561185157600080fd5b823561185c81611bf3565b915060208301356117f281611c08565b60006020828403121561187e57600080fd5b815161177481611c08565b60006020828403121561189b57600080fd5b5051919050565b600080604083850312156118b557600080fd5b8235915060208301356117f281611bf3565b600060808201868352602060808185015281875180845260a086019150828901935060005b818110156119115784516001600160a01b0316835293830193918301916001016118ec565b50506001600160a01b039690961660408501525050506060015292915050565b600060208083528351808285015260005b8181101561195e57858101830151858201604001528201611942565b81811115611970576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600080821280156001600160ff1b03849003851316156119dd576119dd611b21565b600160ff1b83900384128116156119f6576119f6611b21565b50500190565b60008219821115611a0f57611a0f611b21565b500190565b600082611a3157634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611a5057611a50611b21565b500290565b60008083128015600160ff1b850184121615611a7357611a73611b21565b6001600160ff1b0384018313811615611a8e57611a8e611b21565b50500390565b600082821015611aa657611aa6611b21565b500390565b600181811c90821680611abf57607f821691505b60208210811415611ae057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715611b1a57634e487b7160e01b600052604160045260246000fd5b6040525050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060033d1115611b665760046000803e5060005160e01c5b90565b600060443d1015611b775790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611ba757505050505090565b8285019150815181811115611bbf5750505050505090565b843d8701016020828501011115611bd95750505050505090565b611be860208286010187611ae6565b509095945050505050565b6001600160a01b0381168114610e0757600080fd5b8015158114610e0757600080fdfea26469706673582212208f035a6cd537f7e6f74e450aaaa68371f75a7136ac39336d4aeae808e370071b64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106104405760003560e01c806375cb1bd111610234578063aafd847a1161012e578063d4c989d3116100b6578063e9910b2b1161007a578063e9910b2b14610d10578063f2fde38b14610d26578063f5742d9714610d46578063f69e204614610d5c578063fee4675c14610d7157600080fd5b8063d4c989d314610c54578063dd62ed3e14610c74578063e01af92c14610cba578063e2f4560514610cda578063e4956ce214610cf057600080fd5b8063c3033aeb116100fd578063c3033aeb14610bbe578063c6af580b14610bde578063c705c56914610bfe578063c98139e614610c1e578063d2fcc00114610c3457600080fd5b8063aafd847a14610b48578063af7999cd14610b68578063bd48460614610b7e578063c024666814610b9e57600080fd5b8063952e53b8116101bc578063a68fe71a11610180578063a68fe71a14610aa8578063a8b9d24014610ac8578063a9059cbb14610ae8578063a92a64e214610b08578063aa4e8c4a14610b2857600080fd5b8063952e53b814610a1d57806395d89b4114610a335780639c8e841d14610a48578063a457c2d714610a68578063a680e0bc14610a8857600080fd5b8063870bd30b11610203578063870bd30b1461097a5780638da5cb5b1461099a5780638e126944146109b85780638ea5220f146109d8578063902cda77146109fd57600080fd5b806375cb1bd1146108dc578063769758e5146108fc5780637b510fe8146109125780638121a1eb1461096457600080fd5b8063395093511161034557806358f4bea1116102cd5780636ddd1713116102915780636ddd17131461084657806370a0823114610865578063715018a61461089b578063737718dd146108b0578063744d1591146108c657600080fd5b806358f4bea11461077e5780635e843ad214610794578063658c27a9146107b457806368c51e35146107ed5780636dd3d39f1461080d57600080fd5b806349bd5a5e1161031457806349bd5a5e146106e65780634e71d92d146107065780634fbee1931461071b57806357777d311461075357806358076c571461076957600080fd5b8063395093511461067b5780633ee0ce021461069b57806340225fce146106b05780634626402b146106c657600080fd5b806323b872dd116103c85780632c1f5216116103975780632c1f5216146105f25780632f4504ae1461061257806330a1b44b14610633578063313ce5671461064957806337eb15281461066557600080fd5b806323b872dd1461058657806323edbb08146105a6578063244ea525146105bc57806327ce0147146105d257600080fd5b80630dd871571161040f5780630dd87157146104e95780631694505e1461050d57806318160ddd1461054557806322139ec21461055a578063225e5eb71461057057600080fd5b80630483f7a01461044c57806306fdde031461046e578063095ea7b3146104995780630b6bb6f5146104c957600080fd5b3661044757005b600080fd5b34801561045857600080fd5b5061046c610467366004613108565b610d87565b005b34801561047a57600080fd5b50610483610e25565b60405161049091906133d5565b60405180910390f35b3480156104a557600080fd5b506104b96104b4366004613136565b610eb7565b6040519015158152602001610490565b3480156104d557600080fd5b5061046c6104e43660046131ab565b610ecd565b3480156104f557600080fd5b506104ff60175481565b604051908152602001610490565b34801561051957600080fd5b5060265461052d906001600160a01b031681565b6040516001600160a01b039091168152602001610490565b34801561055157600080fd5b506019546104ff565b34801561056657600080fd5b506104ff600d5481565b34801561057c57600080fd5b506104ff60135481565b34801561059257600080fd5b506104b96105a13660046130c7565b610f69565b3480156105b257600080fd5b506104ff60105481565b3480156105c857600080fd5b506104ff602a5481565b3480156105de57600080fd5b506104ff6105ed366004613002565b61101b565b3480156105fe57600080fd5b5060255461052d906001600160a01b031681565b34801561061e57600080fd5b506018546104b9906301000000900460ff1681565b34801561063f57600080fd5b506104ff60065481565b34801561065557600080fd5b5060405160128152602001610490565b34801561067157600080fd5b506104ff60155481565b34801561068757600080fd5b506104b9610696366004613136565b6110a0565b3480156106a757600080fd5b5061046c6110d7565b3480156106bc57600080fd5b506104ff60145481565b3480156106d257600080fd5b50601b5461052d906001600160a01b031681565b3480156106f257600080fd5b5060275461052d906001600160a01b031681565b34801561071257600080fd5b5061046c61113c565b34801561072757600080fd5b506104b9610736366004613002565b6001600160a01b0316600090815260208052604090205460ff1690565b34801561075f57600080fd5b506104ff60285481565b34801561077557600080fd5b5061046c6111cb565b34801561078a57600080fd5b506104ff60125481565b3480156107a057600080fd5b5061046c6107af3660046132b1565b6112b1565b3480156107c057600080fd5b506104b96107cf366004613002565b6001600160a01b031660009081526023602052604090205460ff1690565b3480156107f957600080fd5b5061046c6108083660046132e8565b611309565b34801561081957600080fd5b506104b9610828366004613002565b6001600160a01b031660009081526024602052604090205460ff1690565b34801561085257600080fd5b506018546104b990610100900460ff1681565b34801561087157600080fd5b506104ff610880366004613002565b6001600160a01b03166000908152601e602052604090205490565b3480156108a757600080fd5b5061046c611338565b3480156108bc57600080fd5b506104ff60115481565b3480156108d257600080fd5b506104ff60295481565b3480156108e857600080fd5b5061046c6108f7366004613043565b61136c565b34801561090857600080fd5b506104ff600a5481565b34801561091e57600080fd5b5061093261092d366004613002565b6113e3565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610490565b34801561097057600080fd5b506104ff60085481565b34801561098657600080fd5b506018546104b99062010000900460ff1681565b3480156109a657600080fd5b506000546001600160a01b031661052d565b3480156109c457600080fd5b5061046c6109d336600461331a565b61147c565b3480156109e457600080fd5b50601a5461052d9061010090046001600160a01b031681565b348015610a0957600080fd5b50601c5461052d906001600160a01b031681565b348015610a2957600080fd5b506104ff600b5481565b348015610a3f57600080fd5b506104836114df565b348015610a5457600080fd5b5061046c610a63366004613108565b6114ee565b348015610a7457600080fd5b506104b9610a83366004613136565b6115ac565b348015610a9457600080fd5b506104ff610aa3366004613002565b611648565b348015610ab457600080fd5b5061046c610ac33660046132e8565b61167b565b348015610ad457600080fd5b506104ff610ae3366004613002565b6116aa565b348015610af457600080fd5b506104b9610b03366004613136565b6116dd565b348015610b1457600080fd5b5061046c610b2336600461336d565b6116ea565b348015610b3457600080fd5b5061046c610b433660046132e8565b611780565b348015610b5457600080fd5b506104ff610b63366004613002565b6117af565b348015610b7457600080fd5b506104ff600e5481565b348015610b8a57600080fd5b50601d5461052d906001600160a01b031681565b348015610baa57600080fd5b5061046c610bb9366004613108565b6117e2565b348015610bca57600080fd5b5061046c610bd93660046131ab565b6118f1565b348015610bea57600080fd5b5061046c610bf9366004613277565b611989565b348015610c0a57600080fd5b506104b9610c19366004613002565b611a09565b348015610c2a57600080fd5b506104ff60095481565b348015610c4057600080fd5b5061046c610c4f366004613108565b611a87565b348015610c6057600080fd5b5061046c610c6f366004613108565b611adc565b348015610c8057600080fd5b506104ff610c8f36600461308e565b6001600160a01b039182166000908152601f6020908152604080832093909416825291909152205490565b348015610cc657600080fd5b5061046c610cd5366004613277565b611b31565b348015610ce657600080fd5b506104ff60165481565b348015610cfc57600080fd5b5061046c610d0b366004613277565b611ba4565b348015610d1c57600080fd5b506104ff600f5481565b348015610d3257600080fd5b5061046c610d41366004613002565b611c1b565b348015610d5257600080fd5b506104ff600c5481565b348015610d6857600080fd5b5061046c611cb3565b348015610d7d57600080fd5b506104ff60075481565b6000546001600160a01b03163314610dba5760405162461bcd60e51b8152600401610db190613527565b60405180910390fd5b60255460405162241fbd60e51b81526001600160a01b038481166004830152831515602483015290911690630483f7a0906044015b600060405180830381600087803b158015610e0957600080fd5b505af1158015610e1d573d6000803e3d6000fd5b505050505050565b606060048054610e349061363d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e609061363d565b8015610ead5780601f10610e8257610100808354040283529160200191610ead565b820191906000526020600020905b815481529060010190602001808311610e9057829003601f168201915b5050505050905090565b6000610ec4338484611d2e565b50600192915050565b6000546001600160a01b03163314610ef75760405162461bcd60e51b8152600401610db190613527565b60005b81518160ff161015610f6557600160216000848460ff1681518110610f2157610f216136ae565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f5d81613678565b915050610efa565b5050565b6000610f76848484611e55565b6001600160a01b0384166000908152601f6020908152604080832033845290915290205482811015610ffc5760405162461bcd60e51b815260206004820152602960248201527f504c555455533a207472616e7366657220616d6f756e74206578636565647320604482015268616c6c6f77616e636560b81b6064820152608401610db1565b611010853361100b8685613626565b611d2e565b506001949350505050565b6025546040516327ce014760e01b81526001600160a01b03838116600483015260009216906327ce0147906024015b60206040518083038186803b15801561106257600080fd5b505afa158015611076573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109a9190613301565b92915050565b336000818152601f602090815260408083206001600160a01b03871684529091528120549091610ec491859061100b9086906135cd565b6000546001600160a01b031633146111015760405162461bcd60e51b8152600401610db190613527565b306000908152601e6020526040902054601854479060ff16158015611127575060165482115b156111325760165491505b610f6582826126ab565b6025546001600160a01b031663807ab4f7335b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381600087803b15801561119057600080fd5b505af11580156111a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c89190613294565b50565b6000546001600160a01b031633146111f55760405162461bcd60e51b8152600401610db190613527565b61121161120a6000546001600160a01b031690565b60016117e2565b61121c3060016117e2565b602554611233906001600160a01b031660016117e2565b61124f6112486000546001600160a01b031690565b6001611adc565b61125a306001611adc565b602554611271906001600160a01b03166001611adc565b61128d6112866000546001600160a01b031690565b6001611a87565b611298306001611a87565b6025546112af906001600160a01b03166001611a87565b565b6000546001600160a01b031633146112db5760405162461bcd60e51b8152600401610db190613527565b6018805460169390935590151560ff19931515610100029390931661ffff1990921691909117919091179055565b6000546001600160a01b031633146113335760405162461bcd60e51b8152600401610db190613527565b602955565b6000546001600160a01b031633146113625760405162461bcd60e51b8152600401610db190613527565b6112af6000612c90565b6000546001600160a01b031633146113965760405162461bcd60e51b8152600401610db190613527565b601b80546001600160a01b039485166001600160a01b031991821617909155601a805493851661010002610100600160a81b031990941693909317909255601c8054919093169116179055565b602554604051630f6a21fd60e31b81526001600160a01b0383811660048301526000928392839283928392911690637b510fe89060240160a06040518083038186803b15801561143257600080fd5b505afa158015611446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146a9190613162565b939a9299509097509550909350915050565b6000546001600160a01b031633146114a65760405162461bcd60e51b8152600401610db190613527565b6025546040516323849a5160e21b8152600481018490526001600160a01b03838116602483015290911690638e12694490604401610def565b606060058054610e349061363d565b6000546001600160a01b031633146115185760405162461bcd60e51b8152600401610db190613527565b6001600160a01b03821660009081526022602052604090205460ff16156115815760405162461bcd60e51b815260206004820152601860248201527f7573657220616c726561647920626c61636b6c697374656400000000000000006044820152606401610db1565b6001600160a01b03919091166000908152602260205260409020805460ff1916911515919091179055565b336000908152601f602090815260408083206001600160a01b03861684529091528120548281101561162f5760405162461bcd60e51b815260206004820152602660248201527f504c555455533a2064656372656173656420616c6c6f77616e63652062656c6f60448201526577207a65726f60d01b6064820152608401610db1565b61163e338561100b8685613626565b5060019392505050565b6025546040516329a0382f60e21b81526001600160a01b038381166004830152600092169063a680e0bc9060240161104a565b6000546001600160a01b031633146116a55760405162461bcd60e51b8152600401610db190613527565b602b55565b6025546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d2409060240161104a565b6000610ec4338484611e55565b6000546001600160a01b031633146117145760405162461bcd60e51b8152600401610db190613527565b600b8a9055600c869055600d899055600e889055600f879055601085905560118190556012849055601383905560148290558589886117538b8e6135cd565b61175d91906135cd565b61176791906135cd565b61177191906135cd565b60155550505050505050505050565b6000546001600160a01b031633146117aa5760405162461bcd60e51b8152600401610db190613527565b602855565b60255460405163557ec23d60e11b81526001600160a01b038381166004830152600092169063aafd847a9060240161104a565b6000546001600160a01b0316331461180c5760405162461bcd60e51b8152600401610db190613527565b6001600160a01b038216600090815260208052604090205460ff16151581151514156118945760405162461bcd60e51b815260206004820152603160248201527f504c555455533a206163636f756e7420697320616c72656164792073657420746044820152706f2072657175657374656420737461746560781b6064820152608401610db1565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b0316331461191b5760405162461bcd60e51b8152600401610db190613527565b60005b81518160ff161015610f6557600160226000848460ff1681518110611945576119456136ae565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061198181613678565b91505061191e565b6000546001600160a01b031633146119b35760405162461bcd60e51b8152600401610db190613527565b60188054821515620100000262ff0000199091161790556040517f5bb2376cf656637e70e36c01d3da25685bf3b353f18681b8a5e48c7b2effe133906119fe90831515815260200190565b60405180910390a150565b60255460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c5699060240160206040518083038186803b158015611a4f57600080fd5b505afa158015611a63573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109a9190613294565b6000546001600160a01b03163314611ab15760405162461bcd60e51b8152600401610db190613527565b6001600160a01b03919091166000908152602460205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611b065760405162461bcd60e51b8152600401610db190613527565b6001600160a01b03919091166000908152602360205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314611b5b5760405162461bcd60e51b8152600401610db190613527565b601880548215156101000261ff00199091161790556040517fb9bbb15e341600c8d067a0cadeba219905d5ba6d422b193c9c32265d26fc51c8906119fe90831515815260200190565b6000546001600160a01b03163314611bce5760405162461bcd60e51b8152600401610db190613527565b6018805482151563010000000263ff000000199091161790556040517f341322866a3a2c26c27efa4c270c5ba86f6963257118897dd8196f224c002d43906119fe90831515815260200190565b6000546001600160a01b03163314611c455760405162461bcd60e51b8152600401610db190613527565b6001600160a01b038116611caa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610db1565b6111c881612c90565b6018546301000000900460ff16611d175760405162461bcd60e51b815260206004820152602260248201527f504c555455533a20636f6d706f756e64696e67206973206e6f7420656e61626c604482015261195960f21b6064820152608401610db1565b6025546001600160a01b0316636de1a5a93361114f565b6001600160a01b038316611d925760405162461bcd60e51b815260206004820152602560248201527f504c555455533a20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610db1565b6001600160a01b038216611df45760405162461bcd60e51b815260206004820152602360248201527f504c555455533a20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610db1565b6001600160a01b038381166000818152601f602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b42602b541080611e7257506000546001600160a01b038481169116145b80611e8a57506000546001600160a01b038381169116145b80611ead57506001600160a01b03831660009081526021602052604090205460ff165b80611ed057506001600160a01b03821660009081526021602052604090205460ff165b611f1c5760405162461bcd60e51b815260206004820181905260248201527f504c555455533a20546f6b656e2069736e2774207472616461626c65207965746044820152606401610db1565b6001600160a01b03831660009081526022602052604090205460ff1615611f855760405162461bcd60e51b815260206004820152601d60248201527f504c555455533a2053656e64657220697320626c61636b6c69737465640000006044820152606401610db1565b6001600160a01b03821660009081526022602052604090205460ff1615611fee5760405162461bcd60e51b815260206004820181905260248201527f504c555455533a20526563697069656e7420697320626c61636b6c69737465646044820152606401610db1565b6001600160a01b0383166120145760405162461bcd60e51b8152600401610db19061342a565b6001600160a01b03821661203a5760405162461bcd60e51b8152600401610db19061349c565b600061271060285461204b60195490565b6120559190613607565b61205f91906135e5565b9050600061271060295461207260195490565b61207c9190613607565b61208691906135e5565b905081831115806120af57506001600160a01b03851660009081526023602052604090205460ff165b6120ef5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610db1565b6000546001600160a01b0386811691161480159061211657506001600160a01b0384163014155b801561213057506002546001600160a01b03858116911614155b801561214a57506027546001600160a01b03858116911614155b15612196576001600160a01b0384166000908152601e602090815260408083205460249092529091205460ff168061218b57508161218885836135cd565b11155b61219457600080fd5b505b6001600160a01b0385166000908152601e6020526040902054838110156121cf5760405162461bcd60e51b8152600401610db1906134e0565b306000908152601e6020526040902054601654601854479183101590610100900460ff1680156121fc5750805b801561220b5750601a5460ff16155b801561222557506026546001600160a01b038a8116911614155b801561223f57506000546001600160a01b038a8116911614155b801561225957506000546001600160a01b03898116911614155b156122a357601a805460ff1916600117905560185460ff1615801561227f575060165483115b1561228a5760165492505b61229483836126ab565b42601755601a805460ff191690555b6027546000906001600160a01b038b811691161480156122d157506026546001600160a01b038a8116911614155b8061230257506027546001600160a01b038a8116911614801561230257506026546001600160a01b038b8116911614155b1561230b575060015b6001600160a01b038a16600090815260208052604090205460ff168061234857506001600160a01b038916600090815260208052604090205460ff165b15612351575060005b601a5460ff168061236b575060185462010000900460ff16155b15612374575060005b8015612574576027546001600160a01b038b81169116141561245b57600f54600e54600d54600c54600b546123a991906135cd565b6123b391906135cd565b6123bd91906135cd565b6123c791906135cd565b6015819055600d546123d9908a613607565b6123e391906135e5565b600655601554600c546123f6908a613607565b61240091906135e5565b600755601554600b54612413908a613607565b61241d91906135e5565b600855601554600e54612430908a613607565b61243a91906135e5565b600955601554600f5461244d908a613607565b61245791906135e5565b600a555b6027546001600160a01b038a81169116141561253c5760145460135460125460115460105461248a91906135cd565b61249491906135cd565b61249e91906135cd565b6124a891906135cd565b60158190556012546124ba908a613607565b6124c491906135e5565b6006556015546011546124d7908a613607565b6124e191906135e5565b6007556015546010546124f4908a613607565b6124fe91906135e5565b600855601554601354612511908a613607565b61251b91906135e5565b60095560155460145461252e908a613607565b61253891906135e5565b600a555b60006127106015548a61254f9190613607565b61255991906135e5565b9050612565818a613626565b98506125728b3083612ce0565b505b61257f8a8a8a612ce0565b6025546001600160a01b031663e30443bc8b6125b0816001600160a01b03166000908152601e602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156125f657600080fd5b505af115801561260a573d6000803e3d6000fd5b50506025546001600160a01b0316915063e30443bc90508a612641816001600160a01b03166000908152601e602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561268757600080fd5b505af115801561269b573d6000803e3d6000fd5b5050505050505050505050505050565b600082116126b7575050565b6000600a546009546006546007546008546126d291906135cd565b6126dc91906135cd565b6126e691906135cd565b6126f091906135cd565b601b549091506000906001600160a01b0316156127235781600854856127169190613607565b61272091906135e5565b90505b601a5460009061010090046001600160a01b03161561275857826006548661274b9190613607565b61275591906135e5565b90505b600080602560009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127a957600080fd5b505afa1580156127bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e19190613301565b11156128035783600a54876127f69190613607565b61280091906135e5565b90505b601c546000906001600160a01b0316156128335784600754886128269190613607565b61283091906135e5565b90505b6000818385612842888c613626565b61284c9190613626565b6128569190613626565b6128609190613626565b9050600061286f6002836135e5565b9050600061287d8284613626565b9050600082858761288e8a8c6135cd565b61289891906135cd565b6128a291906135cd565b6128ac91906135cd565b9050476128b882612dff565b60008b6128c58347613626565b6128cf91906135cd565b90506000836128de8c84613607565b6128e891906135e5565b90506000846128f78c85613607565b61290191906135e5565b90506000856129108c86613607565b61291a91906135e5565b90506000866129298c87613607565b61293391906135e5565b90506000818385612944888a613626565b61294e9190613626565b6129589190613626565b6129629190613626565b905084156129df57601b546040516000916001600160a01b03169087908381818185875af1925050503d80600081146129b7576040519150601f19603f3d011682016040523d82523d6000602084013e6129bc565b606091505b50509050806129dd5760405162461bcd60e51b8152600401610db190613470565b505b8315612aff576000612710602a54866129f89190613607565b612a0291906135e5565b601a5490915060009061010090046001600160a01b0316612a238388613626565b604051600081818185875af1925050503d8060008114612a5f576040519150601f19603f3d011682016040523d82523d6000602084013e612a64565b606091505b5050601d546040519192506000916001600160a01b039091169084908381818185875af1925050503d8060008114612ab8576040519150601f19603f3d011682016040523d82523d6000602084013e612abd565b606091505b5050905081612ade5760405162461bcd60e51b8152600401610db190613470565b80612afb5760405162461bcd60e51b8152600401610db190613470565b5050505b8115612b7a57601c546040516000916001600160a01b03169084908381818185875af1925050503d8060008114612b52576040519150601f19603f3d011682016040523d82523d6000602084013e612b57565b606091505b5050905080612b785760405162461bcd60e51b8152600401610db190613470565b505b612b848982612f32565b604080518b8152602081018390529081018a90527fb63dc6f50047533abe2d6adf180d38d524c8d98e55ad199aac8d6b9801bbe24a9060600160405180910390a18215612c63576025546040516000916001600160a01b03169085908381818185875af1925050503d8060008114612c18576040519150601f19603f3d011682016040523d82523d6000602084013e612c1d565b606091505b505090508015612c6157604080518f8152602081018690527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3910160405180910390a15b505b505060006006819055600781905560088190556009819055600a5550505050505050505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316612d065760405162461bcd60e51b8152600401610db19061342a565b6001600160a01b038216612d2c5760405162461bcd60e51b8152600401610db19061349c565b6001600160a01b0383166000908152601e602052604090205481811015612d655760405162461bcd60e51b8152600401610db1906134e0565b612d6f8282613626565b6001600160a01b038086166000908152601e60205260408082209390935590851681529081208054849290612da59084906135cd565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612df191815260200190565b60405180910390a350505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612e3457612e346136ae565b6001600160a01b03928316602091820292909201810191909152602654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612e8857600080fd5b505afa158015612e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec09190613026565b81600181518110612ed357612ed36136ae565b6001600160a01b039283166020918202929092010152602654612ef99130911684611d2e565b60265460405163791ac94760e01b81526001600160a01b039091169063791ac94790610def90859060009086903090429060040161355c565b602654612f4a9030906001600160a01b031684611d2e565b60265460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b158015612fb257600080fd5b505af1158015612fc6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612feb919061333f565b5050505050565b8035612ffd816136da565b919050565b60006020828403121561301457600080fd5b813561301f816136da565b9392505050565b60006020828403121561303857600080fd5b815161301f816136da565b60008060006060848603121561305857600080fd5b8335613063816136da565b92506020840135613073816136da565b91506040840135613083816136da565b809150509250925092565b600080604083850312156130a157600080fd5b82356130ac816136da565b915060208301356130bc816136da565b809150509250929050565b6000806000606084860312156130dc57600080fd5b83356130e7816136da565b925060208401356130f7816136da565b929592945050506040919091013590565b6000806040838503121561311b57600080fd5b8235613126816136da565b915060208301356130bc816136ef565b6000806040838503121561314957600080fd5b8235613154816136da565b946020939093013593505050565b600080600080600060a0868803121561317a57600080fd5b8551613185816136da565b602087015160408801516060890151608090990151929a91995097965090945092505050565b600060208083850312156131be57600080fd5b823567ffffffffffffffff808211156131d657600080fd5b818501915085601f8301126131ea57600080fd5b8135818111156131fc576131fc6136c4565b8060051b604051601f19603f83011681018181108582111715613221576132216136c4565b604052828152858101935084860182860187018a101561324057600080fd5b600095505b8386101561326a5761325681612ff2565b855260019590950194938601938601613245565b5098975050505050505050565b60006020828403121561328957600080fd5b813561301f816136ef565b6000602082840312156132a657600080fd5b815161301f816136ef565b6000806000606084860312156132c657600080fd5b83356132d1816136ef565b9250602084013591506040840135613083816136ef565b6000602082840312156132fa57600080fd5b5035919050565b60006020828403121561331357600080fd5b5051919050565b6000806040838503121561332d57600080fd5b8235915060208301356130bc816136da565b60008060006060848603121561335457600080fd5b8351925060208401519150604084015190509250925092565b6000806000806000806000806000806101408b8d03121561338d57600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b600060208083528351808285015260005b81811015613402578581018301518582016040015282016133e6565b81811115613414576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526026908201527f504c555455533a207472616e736665722066726f6d20746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526012908201527128262aaa2aa99d102a3c103330b4b632b21760711b604082015260600190565b60208082526024908201527f504c555455533a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526027908201527f504c555455533a207472616e7366657220616d6f756e7420657863656564732060408201526662616c616e636560c81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156135ac5784516001600160a01b031683529383019391830191600101613587565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156135e0576135e0613698565b500190565b60008261360257634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561362157613621613698565b500290565b60008282101561363857613638613698565b500390565b600181811c9082168061365157607f821691505b6020821081141561367257634e487b7160e01b600052602260045260246000fd5b50919050565b600060ff821660ff81141561368f5761368f613698565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146111c857600080fd5b80151581146111c857600080fdfea2646970667358221220c0685054a3cea0b196dd317f3dda813ed78d2a81749f333dd455fc28cff13a5564736f6c63430008070033
Deployed Bytecode Sourcemap
124:24101:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19448:171;;;;;;;;;;-1:-1:-1;19448:171:1;;;;;:::i;:::-;;:::i;:::-;;3898:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4642:202;;;;;;;;;;-1:-1:-1;4642:202:1;;;;;:::i;:::-;;:::i;:::-;;;9670:14:2;;9663:22;9645:41;;9633:2;9618:18;4642:202:1;9505:187:2;14113:181:1;;;;;;;;;;-1:-1:-1;14113:181:1;;;;;:::i;:::-;;:::i;1383:27::-;;;;;;;;;;;;;;;;;;;17482:25:2;;;17470:2;17455:18;1383:27:1;17336:177:2;3124:41:1;;;;;;;;;;-1:-1:-1;3124:41:1;;;;-1:-1:-1;;;;;3124:41:1;;;;;;-1:-1:-1;;;;;7547:32:2;;;7529:51;;7517:2;7502:18;3124:41:1;7383:203:2;4156:106:1;;;;;;;;;;-1:-1:-1;4243:12:1;;4156:106;;798:33;;;;;;;;;;;;;;;;1053:40;;;;;;;;;;;;;;;;5763:477;;;;;;;;;;-1:-1:-1;5763:477:1;;;;;:::i;:::-;;:::i;926:39::-;;;;;;;;;;;;;;;;3280;;;;;;;;;;;;;;;;21704:178;;;;;;;;;;-1:-1:-1;21704:178:1;;;;;:::i;:::-;;:::i;3080:38::-;;;;;;;;;;-1:-1:-1;3080:38:1;;;;-1:-1:-1;;;;;3080:38:1;;;1518:37;;;;;;;;;;-1:-1:-1;1518:37:1;;;;;;;;;;;483:34;;;;;;;;;;;;;;;;4076:74;;;;;;;;;;-1:-1:-1;4076:74:1;;4141:2;19501:36:2;;19489:2;19474:18;4076:74:1;19359:184:2;1142:175:1;;;;;;;;;;;;;;;;4850:270;;;;;;;;;;-1:-1:-1;4850:270:1;;;;;:::i;:::-;;:::i;18421:388::-;;;;;;;;;;;;;:::i;1099:37::-;;;;;;;;;;;;;;;;1751:99;;;;;;;;;;-1:-1:-1;1751:99:1;;;;-1:-1:-1;;;;;1751:99:1;;;3172:28;;;;;;;;;;-1:-1:-1;3172:28:1;;;;-1:-1:-1;;;;;3172:28:1;;;21063:94;;;;;;;;;;;;;:::i;19146:124::-;;;;;;;;;;-1:-1:-1;19146:124:1;;;;;:::i;:::-;-1:-1:-1;;;;;19235:28:1;19212:4;19235:28;;;:19;:28;;;;;;;;;19146:124;3207:28;;;;;;;;;;;;;;;;6246:876;;;;;;;;;;;;;:::i;1013:34::-;;;;;;;;;;;;;;;;22741:280;;;;;;;;;;-1:-1:-1;22741:280:1;;;;;:::i;:::-;;:::i;23255:126::-;;;;;;;;;;-1:-1:-1;23255:126:1;;;;;:::i;:::-;-1:-1:-1;;;;;23345:29:1;23322:4;23345:29;;;:20;:29;;;;;;;;;23255:126;23387:92;;;;;;;;;;-1:-1:-1;23387:92:1;;;;;:::i;:::-;;:::i;23651:162::-;;;;;;;;;;-1:-1:-1;23651:162:1;;;;;:::i;:::-;-1:-1:-1;;;;;23773:33:1;23746:4;23773:33;;;:24;:33;;;;;;;;;23651:162;1447:30;;;;;;;;;;-1:-1:-1;1447:30:1;;;;;;;;;;;4268:169;;;;;;;;;;-1:-1:-1;4268:169:1;;;;;:::i;:::-;-1:-1:-1;;;;;4412:18:1;4382:7;4412:18;;;:9;:18;;;;;;;4268:169;1345:101:0;;;;;;;;;;;;;:::i;971:36:1:-;;;;;;;;;;;;;;;;3241:33;;;;;;;;;;;;;;;;19808:277;;;;;;;;;;-1:-1:-1;19808:277:1;;;;;:::i;:::-;;:::i;656:40::-;;;;;;;;;;;;;;;;21888:268;;;;;;;;;;-1:-1:-1;21888:268:1;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9288:32:2;;;9270:51;;9352:2;9337:18;;9330:34;;;;9380:18;;;9373:34;;;;9438:2;9423:18;;9416:34;9481:3;9466:19;;9459:35;9257:3;9242:19;21888:268:1;9011:489:2;565:39:1;;;;;;;;;;;;;;;;1483:29;;;;;;;;;;-1:-1:-1;1483:29:1;;;;;;;;;;;713:85:0;;;;;;;;;;-1:-1:-1;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;713:85;;19276:166:1;;;;;;;;;;-1:-1:-1;19276:166:1;;;;;:::i;:::-;;:::i;1651:94::-;;;;;;;;;;-1:-1:-1;1651:94:1;;;;;;;-1:-1:-1;;;;;1651:94:1;;;1856:96;;;;;;;;;;-1:-1:-1;1856:96:1;;;;-1:-1:-1;;;;;1856:96:1;;;715:38;;;;;;;;;;;;;;;;3985:85;;;;;;;;;;;;;:::i;23819:184::-;;;;;;;;;;-1:-1:-1;23819:184:1;;;;;:::i;:::-;;:::i;5126:417::-;;;;;;;;;;-1:-1:-1;5126:417:1;;;;;:::i;:::-;;:::i;22162:138::-;;;;;;;;;;-1:-1:-1;22162:138:1;;;;;:::i;:::-;;:::i;7128:110::-;;;;;;;;;;-1:-1:-1;7128:110:1;;;;;:::i;:::-;;:::i;21342:178::-;;;;;;;;;;-1:-1:-1;21342:178:1;;;;;:::i;:::-;;:::i;5549:208::-;;;;;;;;;;-1:-1:-1;5549:208:1;;;;;:::i;:::-;;:::i;20091:966::-;;;;;;;;;;-1:-1:-1;20091:966:1;;;;;:::i;:::-;;:::i;23027:84::-;;;;;;;;;;-1:-1:-1;23027:84:1;;;;;:::i;:::-;;:::i;21526:172::-;;;;;;;;;;-1:-1:-1;21526:172:1;;;;;:::i;:::-;;:::i;837:39::-;;;;;;;;;;;;;;;;1958:95;;;;;;;;;;-1:-1:-1;1958:95:1;;;;-1:-1:-1;;;;;1958:95:1;;;18815:325;;;;;;;;;;-1:-1:-1;18815:325:1;;;;;:::i;:::-;;:::i;24009:179::-;;;;;;;;;;-1:-1:-1;24009:179:1;;;;;:::i;:::-;;:::i;22445:130::-;;;;;;;;;;-1:-1:-1;22445:130:1;;;;;:::i;:::-;;:::i;19625:177::-;;;;;;;;;;-1:-1:-1;19625:177:1;;;;;:::i;:::-;;:::i;610:40::-;;;;;;;;;;;;;;;;23485:160;;;;;;;;;;-1:-1:-1;23485:160:1;;;;;:::i;:::-;;:::i;23117:132::-;;;;;;;;;;-1:-1:-1;23117:132:1;;;;;:::i;:::-;;:::i;4443:193::-;;;;;;;;;;-1:-1:-1;4443:193:1;;;;;:::i;:::-;-1:-1:-1;;;;;4602:18:1;;;4572:7;4602:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4443:193;22306:133;;;;;;;;;;-1:-1:-1;22306:133:1;;;;;:::i;:::-;;:::i;1324:53::-;;;;;;;;;;;;;;;;22581:154;;;;;;;;;;-1:-1:-1;22581:154:1;;;;;:::i;:::-;;:::i;882:38::-;;;;;;;;;;;;;;;;1595:232:0;;;;;;;;;;-1:-1:-1;1595:232:0;;;;;:::i;:::-;;:::i;759:33:1:-;;;;;;;;;;;;;;;;21163:173;;;;;;;;;;;;;:::i;523:36::-;;;;;;;;;;;;;;;;19448:171;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;;;;;;;;;19557:15:1::1;::::0;:55:::1;::::0;-1:-1:-1;;;19557:55:1;;-1:-1:-1;;;;;8296:32:2;;;19557:55:1::1;::::0;::::1;8278:51:2::0;8372:14;;8365:22;8345:18;;;8338:50;19557:15:1;;::::1;::::0;:36:::1;::::0;8251:18:2;;19557:55:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19448:171:::0;;:::o;3898:81::-;3935:13;3967:5;3960:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3898:81;:::o;4642:202::-;4757:4;4777:39;168:10:0;4800:7:1;4809:6;4777:8;:39::i;:::-;-1:-1:-1;4833:4:1;4642:202;;;;:::o;14113:181::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;14198:7:1::1;14193:95;14215:6;:13;14211:1;:17;;;14193:95;;;14273:4;14249:10;:21;14260:6;14267:1;14260:9;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;14249:21:1::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;14249:21:1;:28;;-1:-1:-1;;14249:28:1::1;::::0;::::1;;::::0;;;::::1;::::0;;14230:3;::::1;::::0;::::1;:::i;:::-;;;;14193:95;;;;14113:181:::0;:::o;5763:477::-;5899:4;5915:36;5925:6;5933:9;5944:6;5915:9;:36::i;:::-;-1:-1:-1;;;;;5988:19:1;;5961:24;5988:19;;;:11;:19;;;;;;;;168:10:0;5988:33:1;;;;;;;;6052:26;;;;6031:114;;;;-1:-1:-1;;;6031:114:1;;13667:2:2;6031:114:1;;;13649:21:2;13706:2;13686:18;;;13679:30;13745:34;13725:18;;;13718:62;-1:-1:-1;;;13796:18:2;;;13789:39;13845:19;;6031:114:1;13465:405:2;6031:114:1;6155:57;6164:6;168:10:0;6186:25:1;6205:6;6186:16;:25;:::i;:::-;6155:8;:57::i;:::-;-1:-1:-1;6229:4:1;;5763:477;-1:-1:-1;;;;5763:477:1:o;21704:178::-;21828:15;;:47;;-1:-1:-1;;;21828:47:1;;-1:-1:-1;;;;;7547:32:2;;;21828:47:1;;;7529:51:2;21798:7:1;;21828:15;;:38;;7502:18:2;;21828:47:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21821:54;21704:178;-1:-1:-1;;21704:178:1:o;4850:270::-;168:10:0;4946:4:1;5035:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5035:34:1;;;;;;;;;;4946:4;;4966:126;;5014:7;;5035:47;;5072:10;;5035:47;:::i;18421:388::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;18526:4:1::1;18477:28;4412:18:::0;;;:9;:18;;;;;;18611:12:::1;::::0;18574:21:::1;::::0;18611:12:::1;;18610:13;:58:::0;::::1;;;;18650:18;;18627:20;:41;18610:58;18606:130;;;18707:18;;18684:41;;18606:130;18745:57;18758:20;18780:21;18745:12;:57::i;21063:94::-:0;21097:15;;-1:-1:-1;;;;;21097:15:1;:30;168:10:0;21136:12:1;21097:53;;-1:-1:-1;;;;;;21097:53:1;;;;;;;-1:-1:-1;;;;;7547:32:2;;;21097:53:1;;;7529:51:2;7502:18;;21097:53:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;21063:94::o;6246:876::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;6676:30:1::1;6692:7;759::0::0;785:6;-1:-1:-1;;;;;785:6:0;;713:85;6692:7:1::1;6701:4;6676:15;:30::i;:::-;6716:36;6740:4;6747;6716:15;:36::i;:::-;6786:15;::::0;6762:47:::1;::::0;-1:-1:-1;;;;;6786:15:1::1;::::0;6762::::1;:47::i;:::-;6820:31;6837:7;759::0::0;785:6;-1:-1:-1;;;;;785:6:0;;713:85;6837:7:1::1;6846:4;6820:16;:31::i;:::-;6861:37;6886:4;6893;6861:16;:37::i;:::-;6933:15;::::0;6908:48:::1;::::0;-1:-1:-1;;;;;6933:15:1::1;::::0;6908:16:::1;:48::i;:::-;6967:35;6988:7;759::0::0;785:6;-1:-1:-1;;;;;785:6:0;;713:85;6988:7:1::1;6997:4;6967:20;:35::i;:::-;7012:41;7041:4;7048;7012:20;:41::i;:::-;7092:15;::::0;7063:52:::1;::::0;-1:-1:-1;;;;;7092:15:1::1;::::0;7063:20:::1;:52::i;:::-;6246:876::o:0;22741:280::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;22900:11:1::1;:26:::0;;22936:18:::1;:40:::0;;;;22986:28;::::1;;-1:-1:-1::0;;22900:26:1;::::1;;;;22986:28:::0;;;;-1:-1:-1;;22986:28:1;;;;;;;;;;::::1;::::0;;22741:280::o;23387:92::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;23454:12:1::1;:18:::0;23387:92::o;1345:101:0:-;759:7;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;1409:30:::1;1436:1;1409:18;:30::i;19808:277:1:-:0;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;19978:14:1::1;:32:::0;;-1:-1:-1;;;;;19978:32:1;;::::1;-1:-1:-1::0;;;;;;19978:32:1;;::::1;;::::0;;;20020:9:::1;:22:::0;;;;::::1;19978:32;20020:22;-1:-1:-1::0;;;;;;20020:22:1;;::::1;::::0;;;::::1;::::0;;;20052:11:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;19808:277::o;21888:268::-;22110:15;;:39;;-1:-1:-1;;;22110:39:1;;-1:-1:-1;;;;;7547:32:2;;;22110:39:1;;;7529:51:2;21987:7:1;;;;;;;;;;22110:15;;;:30;;7502:18:2;;22110:39:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22103:46;;;;-1:-1:-1;22103:46:1;;-1:-1:-1;22103:46:1;-1:-1:-1;22103:46:1;;-1:-1:-1;21888:268:1;-1:-1:-1;;21888:268:1:o;19276:166::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;19385:15:1::1;::::0;:50:::1;::::0;-1:-1:-1;;;19385:50:1;;::::1;::::0;::::1;17692:25:2::0;;;-1:-1:-1;;;;;17753:32:2;;;17733:18;;;17726:60;19385:15:1;;::::1;::::0;:34:::1;::::0;17665:18:2;;19385:50:1::1;17518:274:2::0;3985:85:1;4024:13;4056:7;4049:14;;;;;:::i;23819:184::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23905:20:1;::::1;;::::0;;;:13:::1;:20;::::0;;;;;::::1;;23904:21;23896:58;;;::::0;-1:-1:-1;;;23896:58:1;;15247:2:2;23896:58:1::1;::::0;::::1;15229:21:2::0;15286:2;15266:18;;;15259:30;15325:26;15305:18;;;15298:54;15369:18;;23896:58:1::1;15045:348:2::0;23896:58:1::1;-1:-1:-1::0;;;;;23964:20:1;;;::::1;;::::0;;;:13:::1;:20;::::0;;;;:32;;-1:-1:-1;;23964:32:1::1;::::0;::::1;;::::0;;;::::1;::::0;;23819:184::o;5126:417::-;168:10:0;5227:4:1;5274:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5274:34:1;;;;;;;;;;5339:35;;;;5318:120;;;;-1:-1:-1;;;5318:120:1;;15600:2:2;5318:120:1;;;15582:21:2;15639:2;15619:18;;;15612:30;15678:34;15658:18;;;15651:62;-1:-1:-1;;;15729:18:2;;;15722:36;15775:19;;5318:120:1;15398:402:2;5318:120:1;5448:67;168:10:0;5471:7:1;5480:34;5499:15;5480:16;:34;:::i;5448:67::-;-1:-1:-1;5532:4:1;;5126:417;-1:-1:-1;;;5126:417:1:o;22162:138::-;22252:15;;:41;;-1:-1:-1;;;22252:41:1;;-1:-1:-1;;;;;7547:32:2;;;22252:41:1;;;7529:51:2;22226:7:1;;22252:15;;:32;;7502:18:2;;22252:41:1;7383:203:2;7128:110:1;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;7204:15:1::1;:27:::0;7128:110::o;21342:178::-;21466:15;;:47;;-1:-1:-1;;;21466:47:1;;-1:-1:-1;;;;;7547:32:2;;;21466:47:1;;;7529:51:2;21436:7:1;;21466:15;;:38;;7502:18:2;;21466:47:1;7383:203:2;5549:208:1;5667:4;5687:42;168:10:0;5711:9:1;5722:6;5687:9;:42::i;20091:966::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;20463:17:1::1;:35:::0;;;20508:14:::1;:29:::0;;;20547:12:::1;:25:::0;;;20582:18:::1;:37:::0;;;20629:17:::1;:35:::0;;;20674:18:::1;:37:::0;;;20721:15:::1;:31:::0;;;20762:13:::1;:27:::0;;;20799:19:::1;:39:::0;;;20848:18:::1;:37:::0;;;20525:12;20562:10;20649:15;20922:46:::1;20603:16:::0;20483:15;20922:46:::1;:::i;:::-;:76;;;;:::i;:::-;:101;;;;:::i;:::-;:128;;;;:::i;:::-;20896:11;:154:::0;-1:-1:-1;;;;;;;;;;20091:966:1:o;23027:84::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;23090:8:1::1;:14:::0;23027:84::o;21526:172::-;21647:15;;:44;;-1:-1:-1;;;21647:44:1;;-1:-1:-1;;;;;7547:32:2;;;21647:44:1;;;7529:51:2;21617:7:1;;21647:15;;:35;;7502:18:2;;21647:44:1;7383:203:2;18815:325:1;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18920:28:1;::::1;;::::0;;;:19:::1;:28:::0;;;;;;::::1;;:40;;::::0;::::1;;;;18899:136;;;::::0;-1:-1:-1;;;18899:136:1;;11383:2:2;18899:136:1::1;::::0;::::1;11365:21:2::0;11422:2;11402:18;;;11395:30;11461:34;11441:18;;;11434:62;-1:-1:-1;;;11512:18:2;;;11505:47;11569:19;;18899:136:1::1;11181:413:2::0;18899:136:1::1;-1:-1:-1::0;;;;;19045:28:1;::::1;;::::0;;;:19:::1;:28:::0;;;;;;;;:39;;-1:-1:-1;;19045:39:1::1;::::0;::::1;;::::0;;::::1;::::0;;;19099:34;;9645:41:2;;;19099:34:1::1;::::0;9618:18:2;19099:34:1::1;;;;;;;18815:325:::0;;:::o;24009:179::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;24089:7:1::1;24084:98;24106:6;:13;24102:1;:17;;;24084:98;;;24167:4;24140:13;:24;24154:6;24161:1;24154:9;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;24140:24:1::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;24140:24:1;:31;;-1:-1:-1;;24140:31:1::1;::::0;::::1;;::::0;;;::::1;::::0;;24121:3;::::1;::::0;::::1;:::i;:::-;;;;24084:98;;22445:130:::0;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;22512:10:1::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;22512:21:1;;::::1;;::::0;;22548:20:::1;::::0;::::1;::::0;::::1;::::0;22525:8;9670:14:2;9663:22;9645:41;;9633:2;9618:18;;9505:187;22548:20:1::1;;;;;;;;22445:130:::0;:::o;19625:177::-;19747:15;;:48;;-1:-1:-1;;;19747:48:1;;-1:-1:-1;;;;;7547:32:2;;;19747:48:1;;;7529:51:2;19720:4:1;;19747:15;;:39;;7502:18:2;;19747:48:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;23485:160::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23594:33:1;;;::::1;;::::0;;;:24:::1;:33;::::0;;;;:44;;-1:-1:-1;;23594:44:1::1;::::0;::::1;;::::0;;;::::1;::::0;;23485:160::o;23117:132::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23202:29:1;;;::::1;;::::0;;;:20:::1;:29;::::0;;;;:40;;-1:-1:-1;;23202:40:1::1;::::0;::::1;;::::0;;;::::1;::::0;;23117:132::o;22306:133::-;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;22374:11:1::1;:22:::0;;;::::1;;;;-1:-1:-1::0;;22374:22:1;;::::1;;::::0;;22411:21:::1;::::0;::::1;::::0;::::1;::::0;22388:8;9670:14:2;9663:22;9645:41;;9633:2;9618:18;;9505:187;22581:154:1;759:7:0;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;22656:18:1::1;:29:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;22656:29:1;;::::1;;::::0;;22700:28:::1;::::0;::::1;::::0;::::1;::::0;22677:8;9670:14:2;9663:22;9645:41;;9633:2;9618:18;;9505:187;1595:232:0;759:7;785:6;-1:-1:-1;;;;;785:6:0;168:10;925:23;917:68;;;;-1:-1:-1;;;917:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1696:22:0;::::1;1675:107;;;::::0;-1:-1:-1;;;1675:107:0;;12508:2:2;1675:107:0::1;::::0;::::1;12490:21:2::0;12547:2;12527:18;;;12520:30;12586:34;12566:18;;;12559:62;-1:-1:-1;;;12637:18:2;;;12630:36;12683:19;;1675:107:0::1;12306:402:2::0;1675:107:0::1;1792:28;1811:8;1792:18;:28::i;21163:173:1:-:0;21208:18;;;;;;;21200:65;;;;-1:-1:-1;;;21200:65:1;;16729:2:2;21200:65:1;;;16711:21:2;16768:2;16748:18;;;16741:30;16807:34;16787:18;;;16780:62;-1:-1:-1;;;16858:18:2;;;16851:32;16900:19;;21200:65:1;16527:398:2;21200:65:1;21275:15;;-1:-1:-1;;;;;21275:15:1;:31;168:10:0;21315:12:1;89:96:0;12872:362:1;-1:-1:-1;;;;;12994:19:1;;12986:69;;;;-1:-1:-1;;;12986:69:1;;17132:2:2;12986:69:1;;;17114:21:2;17171:2;17151:18;;;17144:30;17210:34;17190:18;;;17183:62;-1:-1:-1;;;17261:18:2;;;17254:35;17306:19;;12986:69:1;16930:401:2;12986:69:1;-1:-1:-1;;;;;13073:21:1;;13065:69;;;;-1:-1:-1;;;13065:69:1;;14435:2:2;13065:69:1;;;14417:21:2;14474:2;14454:18;;;14447:30;14513:34;14493:18;;;14486:62;-1:-1:-1;;;14564:18:2;;;14557:33;14607:19;;13065:69:1;14233:399:2;13065:69:1;-1:-1:-1;;;;;13144:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;13195:32;;17482:25:2;;;13195:32:1;;17455:18:2;13195:32:1;;;;;;;12872:362;;;:::o;7244:4985::-;7402:15;7384;;:33;:70;;;-1:-1:-1;759:7:0;785:6;-1:-1:-1;;;;;7437:17:1;;;785:6:0;;7437:17:1;7384:70;:110;;;-1:-1:-1;759:7:0;785:6;-1:-1:-1;;;;;7474:20:1;;;785:6:0;;7474:20:1;7384:110;:148;;;-1:-1:-1;;;;;;7514:18:1;;;;;;:10;:18;;;;;;;;7384:148;:189;;;-1:-1:-1;;;;;;7552:21:1;;;;;;:10;:21;;;;;;;;7384:189;7363:268;;;;-1:-1:-1;;;7363:268:1;;16368:2:2;7363:268:1;;;16350:21:2;;;16387:18;;;16380:30;16446:34;16426:18;;;16419:62;16498:18;;7363:268:1;16166:356:2;7363:268:1;-1:-1:-1;;;;;7651:21:1;;;;;;:13;:21;;;;;;;;7650:22;7642:64;;;;-1:-1:-1;;;7642:64:1;;14077:2:2;7642:64:1;;;14059:21:2;14116:2;14096:18;;;14089:30;14155:31;14135:18;;;14128:59;14204:18;;7642:64:1;13875:353:2;7642:64:1;-1:-1:-1;;;;;7725:24:1;;;;;;:13;:24;;;;;;;;7724:25;7716:70;;;;-1:-1:-1;;;7716:70:1;;12147:2:2;7716:70:1;;;12129:21:2;;;12166:18;;;12159:30;12225:34;12205:18;;;12198:62;12277:18;;7716:70:1;11945:356:2;7716:70:1;-1:-1:-1;;;;;7805:20:1;;7797:71;;;;-1:-1:-1;;;7797:71:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7899:23:1;;7878:106;;;;-1:-1:-1;;;7878:106:1;;;;;;;:::i;:::-;7995:20;8047:5;8035:8;;8019:13;4243:12;;;4156:106;8019:13;:24;;;;:::i;:::-;8018:34;;;;:::i;:::-;7995:57;;8062:18;8116:5;8100:12;;8084:13;4243:12;;;4156:106;8084:13;:28;;;;:::i;:::-;8083:38;;;;:::i;:::-;8062:59;;8162:12;8152:6;:22;;:54;;;-1:-1:-1;;;;;;8178:28:1;;;;;;:20;:28;;;;;;;;8152:54;8131:118;;;;-1:-1:-1;;;8131:118:1;;11801:2:2;8131:118:1;;;11783:21:2;11840:2;11820:18;;;11813:30;-1:-1:-1;;;11859:18:2;;;11852:47;11916:18;;8131:118:1;11599:341:2;8131:118:1;759:7:0;785:6;-1:-1:-1;;;;;8277:17:1;;;785:6:0;;8277:17:1;;;;:59;;-1:-1:-1;;;;;;8310:26:1;;8331:4;8310:26;;8277:59;:101;;;;-1:-1:-1;8373:4:1;;-1:-1:-1;;;;;8352:26:1;;;8373:4;;8352:26;;8277:101;:143;;;;-1:-1:-1;8407:13:1;;-1:-1:-1;;;;;8394:26:1;;;8407:13;;8394:26;;8277:143;8260:392;;;-1:-1:-1;;;;;4412:18:1;;8445:22;4412:18;;;:9;:18;;;;;;;;;8529:24;:35;;;;;;;;;;:98;;-1:-1:-1;8616:10:1;8589:23;8606:6;8589:14;:23;:::i;:::-;:37;;8529:98;8504:137;;;;;;8431:221;8260:392;-1:-1:-1;;;;;8686:17:1;;8662:21;8686:17;;;:9;:17;;;;;;8734:23;;;;8713:109;;;;-1:-1:-1;;;8713:109:1;;;;;;;:::i;:::-;8882:4;8833:28;4412:18;;;:9;:18;;;;;;9001;;9047:11;;8930:21;;8977:42;;;;9047:11;;;;;:34;;;;;9074:7;9047:34;:59;;;;-1:-1:-1;9098:8:1;;;;9097:9;9047:59;:109;;;;-1:-1:-1;9140:15:1;;-1:-1:-1;;;;;9122:34:1;;;9140:15;;9122:34;;9047:109;:142;;;;-1:-1:-1;759:7:0;785:6;-1:-1:-1;;;;;9172:17:1;;;785:6:0;;9172:17:1;;9047:142;:178;;;;-1:-1:-1;759:7:0;785:6;-1:-1:-1;;;;;9205:20:1;;;785:6:0;;9205:20:1;;9047:178;9030:544;;;9250:8;:15;;-1:-1:-1;;9250:15:1;9261:4;9250:15;;;9285:12;;9250:15;9285:12;9284:13;:58;;;;;9324:18;;9301:20;:41;9284:58;9280:138;;;9385:18;;9362:41;;9280:138;9431:57;9444:20;9466:21;9431:12;:57::i;:::-;9518:15;9503:12;:30;9547:8;:16;;-1:-1:-1;;9547:16:1;;;9030:544;9651:13;;9584:12;;-1:-1:-1;;;;;9633:32:1;;;9651:13;;9633:32;:89;;;;-1:-1:-1;9706:15:1;;-1:-1:-1;;;;;9685:37:1;;;9706:15;;9685:37;;9633:89;9632:198;;;-1:-1:-1;9761:13:1;;-1:-1:-1;;;;;9740:35:1;;;9761:13;;9740:35;:89;;;;-1:-1:-1;9813:15:1;;-1:-1:-1;;;;;9795:34:1;;;9813:15;;9795:34;;9740:89;9615:265;;;-1:-1:-1;9865:4:1;9615:265;-1:-1:-1;;;;;9894:27:1;;;;;;:19;:27;;;;;;;;;:61;;-1:-1:-1;;;;;;9925:30:1;;;;;;:19;:30;;;;;;;;9894:61;9890:107;;;-1:-1:-1;9981:5:1;9890:107;10011:8;;;;;:23;;-1:-1:-1;10024:10:1;;;;;;;10023:11;10011:23;10007:69;;;-1:-1:-1;10060:5:1;10007:69;10090:7;10086:1932;;;10158:13;;-1:-1:-1;;;;;10148:23:1;;;10158:13;;10148:23;10144:809;;;10378:17;;10337:18;;10302:12;;10265:14;;10225:17;;:54;;;;:::i;:::-;:89;;;;:::i;:::-;:130;;;;:::i;:::-;:170;;;;:::i;:::-;10191:11;:204;;;10446:12;;10437:21;;:6;:21;:::i;:::-;10436:37;;;;:::i;:::-;10414:19;:59;10543:11;;10525:14;;10516:23;;:6;:23;:::i;:::-;10515:39;;;;:::i;:::-;10491:21;:63;10670:11;;10629:17;;10620:26;;:6;:26;:::i;:::-;10619:62;;;;:::i;:::-;10572:24;:109;10799:11;;10757:18;;10748:27;;:6;:27;:::i;:::-;10747:63;;;;:::i;:::-;10699:25;:111;10927:11;;10886:17;;10877:26;;:6;:26;:::i;:::-;10876:62;;;;:::i;:::-;10828:25;:110;10144:809;11016:13;;-1:-1:-1;;;;;11003:26:1;;;11016:13;;11003:26;10999:862;;;11240:18;;11198:19;;11162:13;;11124:15;;11083:18;;:56;;;;:::i;:::-;:92;;;;:::i;:::-;:134;;;;:::i;:::-;:175;;;;:::i;:::-;11049:11;:209;;;11309:13;;11300:22;;:6;:22;:::i;:::-;11299:38;;;;:::i;:::-;11277:19;:60;11448:11;;11409:15;;11400:24;;:6;:24;:::i;:::-;11399:60;;;;:::i;:::-;11355:21;:104;11576:11;;11534:18;;11525:27;;:6;:27;:::i;:::-;11524:63;;;;:::i;:::-;11477:24;:110;11706:11;;11663:19;;11654:28;;:6;:28;:::i;:::-;11653:64;;;;:::i;:::-;11605:25;:112;11835:11;;11793:18;;11784:27;;:6;:27;:::i;:::-;11783:63;;;;:::i;:::-;11735:25;:111;10999:862;11875:12;11915:5;11900:11;;11891:6;:20;;;;:::i;:::-;11890:30;;;;:::i;:::-;11875:45;-1:-1:-1;11934:14:1;11875:45;11934:14;;:::i;:::-;;;11962:45;11979:6;11995:4;12002;11962:16;:45::i;:::-;10099:1919;10086:1932;12028:43;12045:6;12053:9;12064:6;12028:16;:43::i;:::-;12082:15;;-1:-1:-1;;;;;12082:15:1;:26;12117:6;12126:17;12117:6;-1:-1:-1;;;;;4412:18:1;4382:7;4412:18;;;:9;:18;;;;;;;4268:169;12126:17;12082:62;;-1:-1:-1;;;;;;12082:62:1;;;;;;;-1:-1:-1;;;;;8023:32:2;;;12082:62:1;;;8005:51:2;8072:18;;;8065:34;7978:18;;12082:62:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12154:15:1;;-1:-1:-1;;;;;12154:15:1;;-1:-1:-1;12154:26:1;;-1:-1:-1;12189:9:1;12201:20;12189:9;-1:-1:-1;;;;;4412:18:1;4382:7;4412:18;;;:9;:18;;;;;;;4268:169;12201:20;12154:68;;-1:-1:-1;;;;;;12154:68:1;;;;;;;-1:-1:-1;;;;;8023:32:2;;;12154:68:1;;;8005:51:2;8072:18;;;8065:34;7978:18;;12154:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7353:4876;;;;;;;7244:4985;;;:::o;14300:4115::-;14386:1;14376:6;:11;14372:48;;14300:4115;;:::o;14372:48::-;14430:23;14605:25;;14565;;14531:19;;14495:21;;14456:24;;:60;;;;:::i;:::-;:94;;;;:::i;:::-;:134;;;;:::i;:::-;:174;;;;:::i;:::-;14797:14;;14430:200;;-1:-1:-1;14750:25:1;;-1:-1:-1;;;;;14797:14:1;14789:37;14785:173;;14932:15;14888:24;;14879:6;:33;;;;:::i;:::-;14878:69;;;;:::i;:::-;14842:105;;14785:173;15018:9;;14968:28;;15018:9;;;-1:-1:-1;;;;;15018:9:1;15010:32;15006:166;;15146:15;15107:19;;15098:6;:28;;;;:::i;:::-;15097:64;;;;:::i;:::-;15058:103;;15006:166;15182:26;15254:1;15222:15;;;;;;;;;-1:-1:-1;;;;;15222:15:1;-1:-1:-1;;;;;15222:27:1;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;15218:171;;;15363:15;15318:25;;15309:6;:34;;;;:::i;:::-;15308:70;;;;:::i;:::-;15271:107;;15218:171;15443:11;;15399:22;;-1:-1:-1;;;;;15443:11:1;15435:34;15431:132;;15537:15;15512:21;;15503:6;:30;;;;:::i;:::-;15502:50;;;;:::i;:::-;15485:67;;15431:132;15573:26;15723:14;15690:18;15655:20;15602:38;15623:17;15602:6;:38;:::i;:::-;:73;;;;:::i;:::-;:106;;;;:::i;:::-;:135;;;;:::i;:::-;15573:164;-1:-1:-1;15747:27:1;15777:22;15798:1;15573:164;15777:22;:::i;:::-;15747:52;-1:-1:-1;15809:26:1;15838:40;15747:52;15838:18;:40;:::i;:::-;15809:69;-1:-1:-1;15888:23:1;16043:19;16014:14;15981:18;15914:52;15946:20;15914:17;:52;:::i;:::-;:85;;;;:::i;:::-;:114;;;;:::i;:::-;:148;;;;:::i;:::-;15888:174;-1:-1:-1;16097:21:1;16128:36;15888:174;16128:19;:36::i;:::-;16174:21;16252:6;16199:37;16223:13;16199:21;:37;:::i;:::-;16198:60;;;;:::i;:::-;16174:84;-1:-1:-1;16269:22:1;16344:15;16295:33;16311:17;16174:84;16295:33;:::i;:::-;16294:65;;;;:::i;:::-;16269:90;-1:-1:-1;16369:17:1;16442:15;16390:36;16406:20;16390:13;:36;:::i;:::-;16389:68;;;;:::i;:::-;16369:88;-1:-1:-1;16467:23:1;16544:15;16494:34;16510:18;16494:13;:34;:::i;:::-;16493:66;;;;:::i;:::-;16467:92;-1:-1:-1;16569:19:1;16638:15;16592:30;16608:14;16592:13;:30;:::i;:::-;16591:62;;;;:::i;:::-;16569:84;-1:-1:-1;16663:23:1;16569:84;16770:15;16746:9;16689:42;16717:14;16689:13;:42;:::i;:::-;:66;;;;:::i;:::-;:96;;;;:::i;:::-;:122;;;;:::i;:::-;16663:148;-1:-1:-1;16861:18:1;;16857:166;;16914:14;;:46;;16896:12;;-1:-1:-1;;;;;16914:14:1;;16941;;16896:12;16914:46;16896:12;16914:46;16941:14;16914;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16895:65;;;16982:7;16974:38;;;;-1:-1:-1;;;16974:38:1;;;;;;;:::i;:::-;16881:142;16857:166;17067:13;;17063:417;;17096:22;17155:5;17134:17;;17122:9;:29;;;;:::i;:::-;17121:39;;;;:::i;:::-;17196:9;;17096:64;;-1:-1:-1;17175:15:1;;17196:9;;;-1:-1:-1;;;;;17196:9:1;17235:26;17096:64;17235:9;:26;:::i;:::-;17196:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17316:10:1;;:42;;17174:105;;-1:-1:-1;17294:16:1;;-1:-1:-1;;;;;17316:10:1;;;;17339:14;;17294:16;17316:42;17294:16;17316:42;17339:14;17316:10;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17293:65;;;17380:10;17372:41;;;;-1:-1:-1;;;17372:41:1;;;;;;;:::i;:::-;17435:11;17427:42;;;;-1:-1:-1;;;17427:42:1;;;;;;;:::i;:::-;17082:398;;;17063:417;17526:15;;17522:157;;17576:11;;:40;;17558:12;;-1:-1:-1;;;;;17576:11:1;;17600;;17558:12;17576:40;17558:12;17576:40;17600:11;17576;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17557:59;;;17638:7;17630:38;;;;-1:-1:-1;;;17630:38:1;;;;;;;:::i;:::-;17543:136;17522:157;17714:49;17727:18;17747:15;17714:12;:49::i;:::-;17778:123;;;19237:25:2;;;19293:2;19278:18;;19271:34;;;19321:18;;;19314:34;;;17778:123:1;;19225:2:2;19210:18;17778:123:1;;;;;;;17958:19;;17954:270;;18020:15;;18012:87;;17994:12;;-1:-1:-1;;;;;18020:15:1;;18066;;17994:12;18012:87;17994:12;18012:87;18066:15;18020;18012:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17993:106;;;18117:7;18113:101;;;18149:50;;;18956:25:2;;;19012:2;18997:18;;18990:34;;;18149:50:1;;18929:18:2;18149:50:1;;;;;;;18113:101;17979:245;17954:270;-1:-1:-1;;18256:1:1;18234:19;:23;;;18267:21;:25;;;18302:24;:28;;;18340:25;:29;;;18379:25;:29;-1:-1:-1;;;;;;;;;;;;;;;;14300:4115:1:o;1981:187:0:-;2054:16;2073:6;;-1:-1:-1;;;;;2089:17:0;;;-1:-1:-1;;;;;;2089:17:0;;;;;;2121:40;;2073:6;;;;;;;2121:40;;2054:16;2121:40;2044:124;1981:187;:::o;12235:631:1:-;-1:-1:-1;;;;;12368:20:1;;12360:71;;;;-1:-1:-1;;;12360:71:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;12462:23:1;;12441:106;;;;-1:-1:-1;;;12441:106:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;12581:17:1;;12557:21;12581:17;;;:9;:17;;;;;;12629:23;;;;12608:109;;;;-1:-1:-1;;;12608:109:1;;;;;;;:::i;:::-;12747:22;12763:6;12747:13;:22;:::i;:::-;-1:-1:-1;;;;;12727:17:1;;;;;;;:9;:17;;;;;;:42;;;;12779:20;;;;;;;;:30;;12803:6;;12727:17;12779:30;;12803:6;;12779:30;:::i;:::-;;;;;;;;12841:9;-1:-1:-1;;;;;12824:35:1;12833:6;-1:-1:-1;;;;;12824:35:1;;12852:6;12824:35;;;;17482:25:2;;17470:2;17455:18;;17336:177;12824:35:1;;;;;;;;12350:516;12235:631;;;:::o;13240:478::-;13327:16;;;13341:1;13327:16;;;;;;;;13303:21;;13327:16;;;;;;;;;;-1:-1:-1;13327:16:1;13303:40;;13371:4;13353;13358:1;13353:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13353:23:1;;;:7;;;;;;;;;;:23;;;;13396:15;;:22;;;-1:-1:-1;;;13396:22:1;;;;:15;;;;;:20;;:22;;;;;13353:7;;13396:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13386:4;13391:1;13386:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13386:32:1;;;:7;;;;;;;;;:32;13460:15;;13428:57;;13445:4;;13460:15;13478:6;13428:8;:57::i;:::-;13495:15;;:216;;-1:-1:-1;;;13495:216:1;;-1:-1:-1;;;;;13495:15:1;;;;:66;;:216;;13575:6;;13495:15;;13641:4;;13667;;13686:15;;13495:216;;;:::i;13724:383::-;13828:15;;13796:57;;13813:4;;-1:-1:-1;;;;;13828:15:1;13846:6;13796:8;:57::i;:::-;13863:15;;:237;;-1:-1:-1;;;13863:237:1;;13931:4;13863:237;;;8740:34:2;;;8790:18;;;8783:34;;;13863:15:1;8833:18:2;;;8826:34;;;8876:18;;;8869:34;8919:19;;;8912:44;14075:15:1;8972:19:2;;;8965:35;-1:-1:-1;;;;;13863:15:1;;;;:31;;13902:6;;8674:19:2;;13863:237:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;13724:383;;:::o;14:134:2:-;82:20;;111:31;82:20;111:31;:::i;:::-;14:134;;;:::o;153:247::-;212:6;265:2;253:9;244:7;240:23;236:32;233:52;;;281:1;278;271:12;233:52;320:9;307:23;339:31;364:5;339:31;:::i;:::-;389:5;153:247;-1:-1:-1;;;153:247:2:o;405:251::-;475:6;528:2;516:9;507:7;503:23;499:32;496:52;;;544:1;541;534:12;496:52;576:9;570:16;595:31;620:5;595:31;:::i;661:553::-;762:6;770;778;831:2;819:9;810:7;806:23;802:32;799:52;;;847:1;844;837:12;799:52;886:9;873:23;905:31;930:5;905:31;:::i;:::-;955:5;-1:-1:-1;1012:2:2;997:18;;984:32;1025:33;984:32;1025:33;:::i;:::-;1077:7;-1:-1:-1;1136:2:2;1121:18;;1108:32;1149:33;1108:32;1149:33;:::i;:::-;1201:7;1191:17;;;661:553;;;;;:::o;1219:388::-;1287:6;1295;1348:2;1336:9;1327:7;1323:23;1319:32;1316:52;;;1364:1;1361;1354:12;1316:52;1403:9;1390:23;1422:31;1447:5;1422:31;:::i;:::-;1472:5;-1:-1:-1;1529:2:2;1514:18;;1501:32;1542:33;1501:32;1542:33;:::i;:::-;1594:7;1584:17;;;1219:388;;;;;:::o;1612:456::-;1689:6;1697;1705;1758:2;1746:9;1737:7;1733:23;1729:32;1726:52;;;1774:1;1771;1764:12;1726:52;1813:9;1800:23;1832:31;1857:5;1832:31;:::i;:::-;1882:5;-1:-1:-1;1939:2:2;1924:18;;1911:32;1952:33;1911:32;1952:33;:::i;:::-;1612:456;;2004:7;;-1:-1:-1;;;2058:2:2;2043:18;;;;2030:32;;1612:456::o;2073:382::-;2138:6;2146;2199:2;2187:9;2178:7;2174:23;2170:32;2167:52;;;2215:1;2212;2205:12;2167:52;2254:9;2241:23;2273:31;2298:5;2273:31;:::i;:::-;2323:5;-1:-1:-1;2380:2:2;2365:18;;2352:32;2393:30;2352:32;2393:30;:::i;2460:315::-;2528:6;2536;2589:2;2577:9;2568:7;2564:23;2560:32;2557:52;;;2605:1;2602;2595:12;2557:52;2644:9;2631:23;2663:31;2688:5;2663:31;:::i;:::-;2713:5;2765:2;2750:18;;;;2737:32;;-1:-1:-1;;;2460:315:2:o;2780:497::-;2886:6;2894;2902;2910;2918;2971:3;2959:9;2950:7;2946:23;2942:33;2939:53;;;2988:1;2985;2978:12;2939:53;3020:9;3014:16;3039:31;3064:5;3039:31;:::i;:::-;3134:2;3119:18;;3113:25;3178:2;3163:18;;3157:25;3222:2;3207:18;;3201:25;3266:3;3251:19;;;3245:26;3089:5;;3113:25;;-1:-1:-1;3157:25:2;3201;-1:-1:-1;3245:26:2;;-1:-1:-1;2780:497:2;-1:-1:-1;;;2780:497:2:o;3282:1132::-;3366:6;3397:2;3440;3428:9;3419:7;3415:23;3411:32;3408:52;;;3456:1;3453;3446:12;3408:52;3496:9;3483:23;3525:18;3566:2;3558:6;3555:14;3552:34;;;3582:1;3579;3572:12;3552:34;3620:6;3609:9;3605:22;3595:32;;3665:7;3658:4;3654:2;3650:13;3646:27;3636:55;;3687:1;3684;3677:12;3636:55;3723:2;3710:16;3745:2;3741;3738:10;3735:36;;;3751:18;;:::i;:::-;3797:2;3794:1;3790:10;3829:2;3823:9;3892:2;3888:7;3883:2;3879;3875:11;3871:25;3863:6;3859:38;3947:6;3935:10;3932:22;3927:2;3915:10;3912:18;3909:46;3906:72;;;3958:18;;:::i;:::-;3994:2;3987:22;4044:18;;;4078:15;;;;-1:-1:-1;4113:11:2;;;4143;;;4139:20;;4136:33;-1:-1:-1;4133:53:2;;;4182:1;4179;4172:12;4133:53;4204:1;4195:10;;4214:169;4228:2;4225:1;4222:9;4214:169;;;4285:23;4304:3;4285:23;:::i;:::-;4273:36;;4246:1;4239:9;;;;;4329:12;;;;4361;;4214:169;;;-1:-1:-1;4402:6:2;3282:1132;-1:-1:-1;;;;;;;;3282:1132:2:o;4419:241::-;4475:6;4528:2;4516:9;4507:7;4503:23;4499:32;4496:52;;;4544:1;4541;4534:12;4496:52;4583:9;4570:23;4602:28;4624:5;4602:28;:::i;4665:245::-;4732:6;4785:2;4773:9;4764:7;4760:23;4756:32;4753:52;;;4801:1;4798;4791:12;4753:52;4833:9;4827:16;4852:28;4874:5;4852:28;:::i;4915:444::-;4986:6;4994;5002;5055:2;5043:9;5034:7;5030:23;5026:32;5023:52;;;5071:1;5068;5061:12;5023:52;5110:9;5097:23;5129:28;5151:5;5129:28;:::i;:::-;5176:5;-1:-1:-1;5228:2:2;5213:18;;5200:32;;-1:-1:-1;5284:2:2;5269:18;;5256:32;5297:30;5256:32;5297:30;:::i;5364:180::-;5423:6;5476:2;5464:9;5455:7;5451:23;5447:32;5444:52;;;5492:1;5489;5482:12;5444:52;-1:-1:-1;5515:23:2;;5364:180;-1:-1:-1;5364:180:2:o;5549:184::-;5619:6;5672:2;5660:9;5651:7;5647:23;5643:32;5640:52;;;5688:1;5685;5678:12;5640:52;-1:-1:-1;5711:16:2;;5549:184;-1:-1:-1;5549:184:2:o;5738:315::-;5806:6;5814;5867:2;5855:9;5846:7;5842:23;5838:32;5835:52;;;5883:1;5880;5873:12;5835:52;5919:9;5906:23;5896:33;;5979:2;5968:9;5964:18;5951:32;5992:31;6017:5;5992:31;:::i;6058:306::-;6146:6;6154;6162;6215:2;6203:9;6194:7;6190:23;6186:32;6183:52;;;6231:1;6228;6221:12;6183:52;6260:9;6254:16;6244:26;;6310:2;6299:9;6295:18;6289:25;6279:35;;6354:2;6343:9;6339:18;6333:25;6323:35;;6058:306;;;;;:::o;6369:799::-;6509:6;6517;6525;6533;6541;6549;6557;6565;6573;6581;6634:3;6622:9;6613:7;6609:23;6605:33;6602:53;;;6651:1;6648;6641:12;6602:53;-1:-1:-1;;6674:23:2;;;6744:2;6729:18;;6716:32;;-1:-1:-1;6795:2:2;6780:18;;6767:32;;6846:2;6831:18;;6818:32;;-1:-1:-1;6897:3:2;6882:19;;6869:33;;-1:-1:-1;6949:3:2;6934:19;;6921:33;;-1:-1:-1;7001:3:2;6986:19;;6973:33;;-1:-1:-1;7053:3:2;7038:19;;7025:33;;-1:-1:-1;7105:3:2;7090:19;;7077:33;;-1:-1:-1;7157:3:2;7142:19;7129:33;;-1:-1:-1;6369:799:2;-1:-1:-1;6369:799:2:o;10172:597::-;10284:4;10313:2;10342;10331:9;10324:21;10374:6;10368:13;10417:6;10412:2;10401:9;10397:18;10390:34;10442:1;10452:140;10466:6;10463:1;10460:13;10452:140;;;10561:14;;;10557:23;;10551:30;10527:17;;;10546:2;10523:26;10516:66;10481:10;;10452:140;;;10610:6;10607:1;10604:13;10601:91;;;10680:1;10675:2;10666:6;10655:9;10651:22;10647:31;10640:42;10601:91;-1:-1:-1;10753:2:2;10732:15;-1:-1:-1;;10728:29:2;10713:45;;;;10760:2;10709:54;;10172:597;-1:-1:-1;;;10172:597:2:o;10774:402::-;10976:2;10958:21;;;11015:2;10995:18;;;10988:30;11054:34;11049:2;11034:18;;11027:62;-1:-1:-1;;;11120:2:2;11105:18;;11098:36;11166:3;11151:19;;10774:402::o;12713:342::-;12915:2;12897:21;;;12954:2;12934:18;;;12927:30;-1:-1:-1;;;12988:2:2;12973:18;;12966:48;13046:2;13031:18;;12713:342::o;13060:400::-;13262:2;13244:21;;;13301:2;13281:18;;;13274:30;13340:34;13335:2;13320:18;;13313:62;-1:-1:-1;;;13406:2:2;13391:18;;13384:34;13450:3;13435:19;;13060:400::o;14637:403::-;14839:2;14821:21;;;14878:2;14858:18;;;14851:30;14917:34;14912:2;14897:18;;14890:62;-1:-1:-1;;;14983:2:2;14968:18;;14961:37;15030:3;15015:19;;14637:403::o;15805:356::-;16007:2;15989:21;;;16026:18;;;16019:30;16085:34;16080:2;16065:18;;16058:62;16152:2;16137:18;;15805:356::o;17797:980::-;18059:4;18107:3;18096:9;18092:19;18138:6;18127:9;18120:25;18164:2;18202:6;18197:2;18186:9;18182:18;18175:34;18245:3;18240:2;18229:9;18225:18;18218:31;18269:6;18304;18298:13;18335:6;18327;18320:22;18373:3;18362:9;18358:19;18351:26;;18412:2;18404:6;18400:15;18386:29;;18433:1;18443:195;18457:6;18454:1;18451:13;18443:195;;;18522:13;;-1:-1:-1;;;;;18518:39:2;18506:52;;18613:15;;;;18578:12;;;;18554:1;18472:9;18443:195;;;-1:-1:-1;;;;;;;18694:32:2;;;;18689:2;18674:18;;18667:60;-1:-1:-1;;;18758:3:2;18743:19;18736:35;18655:3;17797:980;-1:-1:-1;;;17797:980:2:o;19548:128::-;19588:3;19619:1;19615:6;19612:1;19609:13;19606:39;;;19625:18;;:::i;:::-;-1:-1:-1;19661:9:2;;19548:128::o;19681:217::-;19721:1;19747;19737:132;;19791:10;19786:3;19782:20;19779:1;19772:31;19826:4;19823:1;19816:15;19854:4;19851:1;19844:15;19737:132;-1:-1:-1;19883:9:2;;19681:217::o;19903:168::-;19943:7;20009:1;20005;20001:6;19997:14;19994:1;19991:21;19986:1;19979:9;19972:17;19968:45;19965:71;;;20016:18;;:::i;:::-;-1:-1:-1;20056:9:2;;19903:168::o;20076:125::-;20116:4;20144:1;20141;20138:8;20135:34;;;20149:18;;:::i;:::-;-1:-1:-1;20186:9:2;;20076:125::o;20206:380::-;20285:1;20281:12;;;;20328;;;20349:61;;20403:4;20395:6;20391:17;20381:27;;20349:61;20456:2;20448:6;20445:14;20425:18;20422:38;20419:161;;;20502:10;20497:3;20493:20;20490:1;20483:31;20537:4;20534:1;20527:15;20565:4;20562:1;20555:15;20419:161;;20206:380;;;:::o;20591:175::-;20628:3;20672:4;20665:5;20661:16;20701:4;20692:7;20689:17;20686:43;;;20709:18;;:::i;:::-;20758:1;20745:15;;20591:175;-1:-1:-1;;20591:175:2:o;20771:127::-;20832:10;20827:3;20823:20;20820:1;20813:31;20863:4;20860:1;20853:15;20887:4;20884:1;20877:15;20903:127;20964:10;20959:3;20955:20;20952:1;20945:31;20995:4;20992:1;20985:15;21019:4;21016:1;21009:15;21035:127;21096:10;21091:3;21087:20;21084:1;21077:31;21127:4;21124:1;21117:15;21151:4;21148:1;21141:15;21167:131;-1:-1:-1;;;;;21242:31:2;;21232:42;;21222:70;;21288:1;21285;21278:12;21303:118;21389:5;21382:13;21375:21;21368:5;21365:32;21355:60;;21411:1;21408;21401:12
Swarm Source
ipfs://8f035a6cd537f7e6f74e450aaaa68371f75a7136ac39336d4aeae808e370071b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,357.83 | 0.00007243 | $0.243219 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.