Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
999,719,990.000000000000007769 CHINU
Holders
32
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
900,900 CHINUValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CHINU
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC20.sol"; import "./Ownable.sol"; import "./SafeMath.sol"; import "./IUniswapV2Pair.sol"; import "./IUniswapV2Router02.sol"; import "./IUniswapV2Factory.sol"; /* @Chinu Token - Website: https://www.chinucoin.io - Telegram: https://t.me/ChinuCoin */ contract CHINU is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 private uniswapV2Router; address private uniswapV2Pair; mapping(address => bool) private _isBlacklisted; bool private _swapping; uint256 private _launchTime; address private feeWallet; uint256 public maxTransactionAmount; uint256 public swapTokensAtAmount; uint256 public maxWallet; bool public limitsInEffect = true; bool public tradingActive = false; // Anti-bot and anti-whale mappings and variables mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch bool public transferDelayEnabled = true; uint256 public totalFees; uint256 private _marketingFee; uint256 private _liquidityFee; uint256 private _devFee; uint256 private _tokensForMarketing; uint256 private _tokensForLiquidity; uint256 private _tokensForDev; uint256 private _burnFee; address payable contractOwner; // exlcude from fees and max transaction amount mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) private _isExcludedMaxTransactionAmount; // store addresses that a automatic market maker pairs. Any transfer *to* these addresses // could be subject to a maximum transfer amount mapping(address => bool) private automatedMarketMakerPairs; event ExcludeFromFees(address indexed account, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event feeWalletUpdated( address indexed newWallet, address indexed oldWallet ); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity ); constructor() ERC20("Chinu Token", "CHINU") { IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); excludeFromMaxTransaction(address(_uniswapV2Router), true); uniswapV2Router = _uniswapV2Router; uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); excludeFromMaxTransaction(address(uniswapV2Pair), true); _setAutomatedMarketMakerPair(address(uniswapV2Pair), true); uint256 marketingFee = 3; uint256 liquidityFee = 3; uint256 devFee = 3; uint256 burnFee = 2; uint256 totalSupply = 1e9 * 1e18; maxTransactionAmount = (totalSupply * 1) / 100; maxWallet = (totalSupply * 1) / 100; swapTokensAtAmount = (totalSupply * 15) / 10000; _marketingFee = marketingFee; _liquidityFee = liquidityFee; _devFee = devFee; totalFees = _marketingFee + _liquidityFee + _devFee; _burnFee = burnFee; feeWallet = address(owner()); // set as fee wallet contractOwner = payable(owner()); // exclude from paying fees or having max transaction amount excludeFromFees(owner(), true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); excludeFromMaxTransaction(owner(), true); excludeFromMaxTransaction(address(this), true); excludeFromMaxTransaction(address(0xdead), true); /* _mint is an internal function in ERC20.sol that is only called here, and CANNOT be called ever again */ _mint(msg.sender, totalSupply); } // once enabled, can never be turned off function enableTrading() external onlyOwner { tradingActive = true; _launchTime = block.timestamp.add(2); } function disableTrading() external onlyOwner { tradingActive = false; } // remove limits after token is stable function removeLimits() external onlyOwner returns (bool) { limitsInEffect = false; return true; } // disable Transfer delay - cannot be reenabled function disableTransferDelay() external onlyOwner returns (bool) { transferDelayEnabled = false; return true; } // change the minimum amount of tokens to sell from fees function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool) { require( newAmount >= (totalSupply() * 1) / 100000, "Swap amount cannot be lower than 0.001% total supply." ); require( newAmount <= (totalSupply() * 5) / 1000, "Swap amount cannot be higher than 0.5% total supply." ); swapTokensAtAmount = newAmount; return true; } function updateMaxTxnAmount(uint256 newNum) external onlyOwner { require( newNum >= ((totalSupply() * 1) / 1000) / 1e18, "Cannot set maxTransactionAmount lower than 0.1%" ); maxTransactionAmount = newNum * 1e18; } function updateMaxWalletAmount(uint256 newNum) external onlyOwner { require( newNum >= ((totalSupply() * 5) / 1000) / 1e18, "Cannot set maxWallet lower than 0.5%" ); maxWallet = newNum * 1e18; } function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner { _isExcludedMaxTransactionAmount[updAds] = isEx; } function updateFees( uint256 marketingFee, uint256 liquidityFee, uint256 devFee ) external onlyOwner { _marketingFee = marketingFee; _liquidityFee = liquidityFee; _devFee = devFee; totalFees = _marketingFee + _liquidityFee + _devFee; require(totalFees <= 10, "Must keep fees at 10% or less"); } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require( pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs" ); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { automatedMarketMakerPairs[pair] = value; emit SetAutomatedMarketMakerPair(pair, value); } function updateFeeWallet(address newWallet) external onlyOwner { emit feeWalletUpdated(newWallet, feeWallet); feeWallet = newWallet; } function isExcludedFromFees(address account) public view returns (bool) { return _isExcludedFromFees[account]; } function setBlacklisted(address[] memory blacklisted_) public onlyOwner { for (uint256 i = 0; i < blacklisted_.length; i++) { if ( blacklisted_[i] != uniswapV2Pair && blacklisted_[i] != address(uniswapV2Router) ) { _isBlacklisted[blacklisted_[i]] = true; } } } function delBlacklisted(address[] memory blacklisted_) public onlyOwner { for (uint256 i = 0; i < blacklisted_.length; i++) { _isBlacklisted[blacklisted_[i]] = false; } } function isSniper(address addr) public view returns (bool) { return _isBlacklisted[addr]; } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require( !_isBlacklisted[from], "Your address has been marked as a sniper, you are unable to transfer or swap." ); if (amount == 0) { super._transfer(from, to, 0); return; } // Burn baby burn! 🔥 if (!_isExcludedFromFees[from] && !_isExcludedFromFees[to]) { uint256 burnAmount = amount.div(100); _burn(from, burnAmount); amount -= burnAmount; } if (block.timestamp <= _launchTime) _isBlacklisted[to] = true; if (limitsInEffect) { if ( from != owner() && to != owner() && to != address(0) && to != address(0xdead) && !_swapping ) { if (!tradingActive) { require( _isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active." ); } // at launch if the transfer delay is enabled, ensure the block timestamps for purchasers is set -- during launch. if (transferDelayEnabled) { if ( to != owner() && to != address(uniswapV2Router) && to != address(uniswapV2Pair) ) { require( _holderLastTransferTimestamp[tx.origin] < block.number, "_transfer:: Transfer Delay enabled. Only one purchase per block allowed." ); _holderLastTransferTimestamp[tx.origin] = block.number; } } // when buy if ( automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to] ) { require( amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount." ); require( amount + balanceOf(to) <= maxWallet, "Max wallet exceeded" ); } // when sell else if ( automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from] ) { require( amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount." ); } else if (!_isExcludedMaxTransactionAmount[to]) { require( amount + balanceOf(to) <= maxWallet, "Max wallet exceeded" ); } } } // uint256 contractTokenBalance = balanceOf(address(this)); if (tradingActive && to == uniswapV2Pair && from != owner()) { revert(); } // bool canSwap = contractTokenBalance >= swapTokensAtAmount; // if ( // canSwap && // !_swapping && // !automatedMarketMakerPairs[from] && // !_isExcludedFromFees[from] && // !_isExcludedFromFees[to] // ) { // _swapping = true; // swapBack(); // _swapping = false; // } bool takeFee = !_swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } uint256 fees = 0; // only take fees on buys/sells, do not take on wallet transfers if (takeFee) { fees = amount.mul(totalFees).div(100); _tokensForLiquidity += (fees * _liquidityFee) / totalFees; _tokensForDev += (fees * _devFee) / totalFees; _tokensForMarketing += (fees * _marketingFee) / totalFees; if (fees > 0) { super._transfer(from, address(this), fees); } amount -= fees; } super._transfer(from, to, amount); } function _swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); uint256 totalTokensToSwap = _tokensForLiquidity + _tokensForMarketing + _tokensForDev; if (contractBalance == 0 || totalTokensToSwap == 0) return; if (contractBalance > swapTokensAtAmount) { contractBalance = swapTokensAtAmount; } // Halve the amount of liquidity tokens uint256 liquidityTokens = (contractBalance * _tokensForLiquidity) / totalTokensToSwap / 2; uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens); uint256 initialETHBalance = address(this).balance; _swapTokensForEth(amountToSwapForETH); uint256 ethBalance = address(this).balance.sub(initialETHBalance); uint256 ethForMarketing = ethBalance.mul(_tokensForMarketing).div( totalTokensToSwap ); uint256 ethForDev = ethBalance.mul(_tokensForDev).div( totalTokensToSwap ); uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForDev; _tokensForLiquidity = 0; _tokensForMarketing = 0; _tokensForDev = 0; payable(feeWallet).transfer(ethForMarketing.add(ethForDev)); if (liquidityTokens > 0 && ethForLiquidity > 0) { _addLiquidity(liquidityTokens, ethForLiquidity); emit SwapAndLiquify( amountToSwapForETH, ethForLiquidity, _tokensForLiquidity ); } } function forceSwap() external onlyOwner { _swapTokensForEth(address(this).balance); payable(feeWallet).transfer(address(this).balance); } function forceSend() external onlyOwner { payable(feeWallet).transfer(address(this).balance); } function withdraw() public payable onlyOwner { // uint256 amount = pendingWithdrawals[msg.sender]; // pendingWithdrawals[msg.sender] = 0; contractOwner.transfer(address(this).balance); } function withdrawToken(address tokenAddress) public payable onlyOwner { IERC20 token = IERC20(tokenAddress); token.transfer(contractOwner, token.balanceOf(address(this))); } receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./IERC20Metadata.sol"; import "./Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ 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: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, 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}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @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) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][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) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(owner, 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require( fromBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @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 Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require( currentAllowance >= amount, "ERC20: insufficient allowance" ); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @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 {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, 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 ); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ 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); }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; 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; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; 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; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; import "./IUniswapV2Router01.sol"; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
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":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":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"feeWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"blacklisted_","type":"address[]"}],"name":"delBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableTransferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"blacklisted_","type":"address[]"}],"name":"setBlacklisted","outputs":[],"stateMutability":"nonpayable","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":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingFee","type":"uint256"},{"internalType":"uint256","name":"liquidityFee","type":"uint256"},{"internalType":"uint256","name":"devFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600f8054600160ff19918216811761ff0019169092556011805490911690911790553480156200003357600080fd5b50604080518082018252600b81526a21b434b73a902a37b5b2b760a91b6020808301918252835180850190945260058452644348494e5560d81b9084015281519192916200008491600391620006ce565b5080516200009a906004906020840190620006ce565b505050620000b7620000b16200041560201b60201c565b62000419565b737a250d5630b4cf539739df2c5dacb4c659f2488d620000d98160016200046b565b600680546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b1580156200012e57600080fd5b505afa15801562000143573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000169919062000774565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620001b257600080fd5b505afa158015620001c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ed919062000774565b6040518363ffffffff1660e01b81526004016200020c929190620007a4565b602060405180830381600087803b1580156200022757600080fd5b505af11580156200023c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000262919062000774565b600780546001600160a01b0319166001600160a01b0392831617908190556200028e911660016200046b565b600754620002a7906001600160a01b03166001620004e5565b6003808060026b033b2e3c9fd0803ce80000006064620002c98260016200087a565b620002d5919062000859565b600c556064620002e78260016200087a565b620002f3919062000859565b600e556127106200030682600f6200087a565b62000312919062000859565b600d55601385905560148490556015839055826200033185876200083e565b6200033d91906200083e565b60125560198290556200034f62000539565b600b80546001600160a01b0319166001600160a01b03929092169190911790556200037962000539565b601a80546001600160a01b0319166001600160a01b0392909216919091179055620003af620003a762000539565b600162000548565b620003bc30600162000548565b620003cb61dead600162000548565b620003e1620003d962000539565b60016200046b565b620003ee3060016200046b565b620003fd61dead60016200046b565b620004093382620005f0565b505050505050620008ef565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200047562000415565b6001600160a01b03166200048862000539565b6001600160a01b031614620004ba5760405162461bcd60e51b8152600401620004b190620007c9565b60405180910390fd5b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b6001600160a01b0382166000818152601d6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b031690565b6200055262000415565b6001600160a01b03166200056562000539565b6001600160a01b0316146200058e5760405162461bcd60e51b8152600401620004b190620007c9565b6001600160a01b0382166000818152601b602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790620005e4908490620007be565b60405180910390a25050565b6001600160a01b038216620006195760405162461bcd60e51b8152600401620004b190620007fe565b6200062760008383620006c9565b80600260008282546200063b91906200083e565b90915550506001600160a01b038216600090815260208190526040812080548392906200066a9084906200083e565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90620006af90859062000835565b60405180910390a3620006c560008383620006c9565b5050565b505050565b828054620006dc906200089c565b90600052602060002090601f0160209004810192826200070057600085556200074b565b82601f106200071b57805160ff19168380011785556200074b565b828001600101855582156200074b579182015b828111156200074b5782518255916020019190600101906200072e565b50620007599291506200075d565b5090565b5b808211156200075957600081556001016200075e565b60006020828403121562000786578081fd5b81516001600160a01b03811681146200079d578182fd5b9392505050565b6001600160a01b0392831681529116602082015260400190565b901515815260200190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60008219821115620008545762000854620008d9565b500190565b6000826200087557634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615620008975762000897620008d9565b500290565b600281046001821680620008b157607f821691505b60208210811415620008d357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b612b0880620008ff6000396000f3fe60806040526004361061024a5760003560e01c80637571336a11610139578063c18bc195116100b6578063dd62ed3e1161007a578063dd62ed3e14610638578063df778d2614610658578063e2f456051461066d578063e884f26014610682578063f2fde38b14610697578063f8b45b05146106b757610251565b8063c18bc195146105ae578063c8125e45146105ce578063c876d0b9146105ee578063c8c8ebe414610603578063d257b34f1461061857610251565b80639a7a23d6116100fd5780639a7a23d614610519578063a457c2d714610539578063a9059cbb14610559578063bbc0c74214610579578063c02466681461058e57610251565b80637571336a1461049a57806389476069146104ba5780638a8c523c146104cd5780638da5cb5b146104e257806395d89b411461050457610251565b806323b872dd116101c75780634fbee1931161018b5780634fbee19314610410578063667185241461043057806370a0823114610450578063715018a614610470578063751039fc1461048557610251565b806323b872dd14610391578063313ce567146103b157806339509351146103d35780633ccfd60b146103f35780634a62bb65146103fb57610251565b806313114a9d1161020e57806313114a9d1461030557806317700f011461032757806318160ddd1461033c578063203e727e14610351578063224290851461037157610251565b806306fdde0314610256578063095ea7b3146102815780630b559c6f146102ae5780630f3a325f146102d057806312b77e8a146102f057610251565b3661025157005b600080fd5b34801561026257600080fd5b5061026b6106cc565b604051610278919061225d565b60405180910390f35b34801561028d57600080fd5b506102a161029c3660046120c2565b61075e565b6040516102789190612252565b3480156102ba57600080fd5b506102ce6102c93660046120ed565b610780565b005b3480156102dc57600080fd5b506102a16102eb366004611fe5565b6108e5565b3480156102fc57600080fd5b506102ce610907565b34801561031157600080fd5b5061031a610982565b6040516102789190612938565b34801561033357600080fd5b506102ce610988565b34801561034857600080fd5b5061031a6109d4565b34801561035d57600080fd5b506102ce61036c3660046121ca565b6109da565b34801561037d57600080fd5b506102ce61038c3660046121fa565b610a83565b34801561039d57600080fd5b506102a16103ac366004612055565b610b10565b3480156103bd57600080fd5b506103c6610b3e565b60405161027891906129b1565b3480156103df57600080fd5b506102a16103ee3660046120c2565b610b43565b6102ce610b8f565b34801561040757600080fd5b506102a1610c07565b34801561041c57600080fd5b506102a161042b366004611fe5565b610c10565b34801561043c57600080fd5b506102ce61044b366004611fe5565b610c2e565b34801561045c57600080fd5b5061031a61046b366004611fe5565b610cca565b34801561047c57600080fd5b506102ce610ce5565b34801561049157600080fd5b506102a1610d30565b3480156104a657600080fd5b506102ce6104b5366004612095565b610d81565b6102ce6104c8366004611fe5565b610deb565b3480156104d957600080fd5b506102ce610f27565b3480156104ee57600080fd5b506104f7610f85565b6040516102789190612225565b34801561051057600080fd5b5061026b610f94565b34801561052557600080fd5b506102ce610534366004612095565b610fa3565b34801561054557600080fd5b506102a16105543660046120c2565b61101a565b34801561056557600080fd5b506102a16105743660046120c2565b61107b565b34801561058557600080fd5b506102a1611093565b34801561059a57600080fd5b506102ce6105a9366004612095565b6110a1565b3480156105ba57600080fd5b506102ce6105c93660046121ca565b611140565b3480156105da57600080fd5b506102ce6105e93660046120ed565b6111e9565b3480156105fa57600080fd5b506102a161129e565b34801561060f57600080fd5b5061031a6112a7565b34801561062457600080fd5b506102a16106333660046121ca565b6112ad565b34801561064457600080fd5b5061031a61065336600461201d565b611376565b34801561066457600080fd5b506102ce6113a1565b34801561067957600080fd5b5061031a6113e9565b34801561068e57600080fd5b506102a16113ef565b3480156106a357600080fd5b506102ce6106b2366004611fe5565b611440565b3480156106c357600080fd5b5061031a6114ae565b6060600380546106db90612a2d565b80601f016020809104026020016040519081016040528092919081815260200182805461070790612a2d565b80156107545780601f1061072957610100808354040283529160200191610754565b820191906000526020600020905b81548152906001019060200180831161073757829003601f168201915b5050505050905090565b6000806107696114b4565b90506107768185856114b8565b5060019392505050565b6107886114b4565b6001600160a01b0316610799610f85565b6001600160a01b0316146107c85760405162461bcd60e51b81526004016107bf90612705565b60405180910390fd5b60005b81518110156108e15760075482516001600160a01b039091169083908390811061080557634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614158015610864575060065482516001600160a01b039091169083908390811061085057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614155b156108cf5760016008600084848151811061088f57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806108d981612a68565b9150506107cb565b5050565b6001600160a01b03811660009081526008602052604090205460ff165b919050565b61090f6114b4565b6001600160a01b0316610920610f85565b6001600160a01b0316146109465760405162461bcd60e51b81526004016107bf90612705565b600b546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561097f573d6000803e3d6000fd5b50565b60125481565b6109906114b4565b6001600160a01b03166109a1610f85565b6001600160a01b0316146109c75760405162461bcd60e51b81526004016107bf90612705565b600f805461ff0019169055565b60025490565b6109e26114b4565b6001600160a01b03166109f3610f85565b6001600160a01b031614610a195760405162461bcd60e51b81526004016107bf90612705565b670de0b6b3a76400006103e8610a2d6109d4565b610a389060016129f7565b610a4291906129d7565b610a4c91906129d7565b811015610a6b5760405162461bcd60e51b81526004016107bf906128e9565b610a7d81670de0b6b3a76400006129f7565b600c5550565b610a8b6114b4565b6001600160a01b0316610a9c610f85565b6001600160a01b031614610ac25760405162461bcd60e51b81526004016107bf90612705565b60138390556014829055601581905580610adc83856129bf565b610ae691906129bf565b6012819055600a1015610b0b5760405162461bcd60e51b81526004016107bf906122f3565b505050565b600080610b1b6114b4565b9050610b2885828561156c565b610b338585856115b6565b506001949350505050565b601290565b600080610b4e6114b4565b6001600160a01b038082166000908152600160209081526040808320938916835292905220549091506107769082908690610b8a9087906129bf565b6114b8565b610b976114b4565b6001600160a01b0316610ba8610f85565b6001600160a01b031614610bce5760405162461bcd60e51b81526004016107bf90612705565b601a546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561097f573d6000803e3d6000fd5b600f5460ff1681565b6001600160a01b03166000908152601b602052604090205460ff1690565b610c366114b4565b6001600160a01b0316610c47610f85565b6001600160a01b031614610c6d5760405162461bcd60e51b81526004016107bf90612705565b600b546040516001600160a01b03918216918316907f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce866492890600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526020819052604090205490565b610ced6114b4565b6001600160a01b0316610cfe610f85565b6001600160a01b031614610d245760405162461bcd60e51b81526004016107bf90612705565b610d2e6000611b6f565b565b6000610d3a6114b4565b6001600160a01b0316610d4b610f85565b6001600160a01b031614610d715760405162461bcd60e51b81526004016107bf90612705565b50600f805460ff19169055600190565b610d896114b4565b6001600160a01b0316610d9a610f85565b6001600160a01b031614610dc05760405162461bcd60e51b81526004016107bf90612705565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b610df36114b4565b6001600160a01b0316610e04610f85565b6001600160a01b031614610e2a5760405162461bcd60e51b81526004016107bf90612705565b601a546040516370a0823160e01b815282916001600160a01b038084169263a9059cbb929091169083906370a0823190610e68903090600401612225565b60206040518083038186803b158015610e8057600080fd5b505afa158015610e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb891906121e2565b6040518363ffffffff1660e01b8152600401610ed5929190612239565b602060405180830381600087803b158015610eef57600080fd5b505af1158015610f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0b91906121ae565b610f2f6114b4565b6001600160a01b0316610f40610f85565b6001600160a01b031614610f665760405162461bcd60e51b81526004016107bf90612705565b600f805461ff001916610100179055610f80426002611bc1565b600a55565b6005546001600160a01b031690565b6060600480546106db90612a2d565b610fab6114b4565b6001600160a01b0316610fbc610f85565b6001600160a01b031614610fe25760405162461bcd60e51b81526004016107bf90612705565b6007546001600160a01b03838116911614156110105760405162461bcd60e51b81526004016107bf90612468565b6108e18282611bd4565b6000806110256114b4565b6001600160a01b038082166000908152600160209081526040808320938916835292905220549091508381101561106e5760405162461bcd60e51b81526004016107bf906128a4565b610b3382868684036114b8565b6000806110866114b4565b90506107768185856115b6565b600f54610100900460ff1681565b6110a96114b4565b6001600160a01b03166110ba610f85565b6001600160a01b0316146110e05760405162461bcd60e51b81526004016107bf90612705565b6001600160a01b0382166000818152601b602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790611134908490612252565b60405180910390a25050565b6111486114b4565b6001600160a01b0316611159610f85565b6001600160a01b03161461117f5760405162461bcd60e51b81526004016107bf90612705565b670de0b6b3a76400006103e86111936109d4565b61119e9060056129f7565b6111a891906129d7565b6111b291906129d7565b8110156111d15760405162461bcd60e51b81526004016107bf90612424565b6111e381670de0b6b3a76400006129f7565b600e5550565b6111f16114b4565b6001600160a01b0316611202610f85565b6001600160a01b0316146112285760405162461bcd60e51b81526004016107bf90612705565b60005b81518110156108e15760006008600084848151811061125a57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061129681612a68565b91505061122b565b60115460ff1681565b600c5481565b60006112b76114b4565b6001600160a01b03166112c8610f85565b6001600160a01b0316146112ee5760405162461bcd60e51b81526004016107bf90612705565b620186a06112fa6109d4565b6113059060016129f7565b61130f91906129d7565b82101561132e5760405162461bcd60e51b81526004016107bf90612598565b6103e86113396109d4565b6113449060056129f7565b61134e91906129d7565b82111561136d5760405162461bcd60e51b81526004016107bf906125ed565b50600d55600190565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6113a96114b4565b6001600160a01b03166113ba610f85565b6001600160a01b0316146113e05760405162461bcd60e51b81526004016107bf90612705565b61094647611c28565b600d5481565b60006113f96114b4565b6001600160a01b031661140a610f85565b6001600160a01b0316146114305760405162461bcd60e51b81526004016107bf90612705565b506011805460ff19169055600190565b6114486114b4565b6001600160a01b0316611459610f85565b6001600160a01b03161461147f5760405162461bcd60e51b81526004016107bf90612705565b6001600160a01b0381166114a55760405162461bcd60e51b81526004016107bf9061239c565b61097f81611b6f565b600e5481565b3390565b6001600160a01b0383166114de5760405162461bcd60e51b81526004016107bf90612833565b6001600160a01b0382166115045760405162461bcd60e51b81526004016107bf906123e2565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061155f908590612938565b60405180910390a3505050565b60006115788484611376565b905060001981146115b057818110156115a35760405162461bcd60e51b81526004016107bf906124c5565b6115b084848484036114b8565b50505050565b6001600160a01b0383166115dc5760405162461bcd60e51b81526004016107bf9061277b565b6001600160a01b0382166116025760405162461bcd60e51b81526004016107bf906122b0565b6001600160a01b03831660009081526008602052604090205460ff161561163b5760405162461bcd60e51b81526004016107bf906127c0565b806116515761164c83836000611dad565b610b0b565b6001600160a01b0383166000908152601b602052604090205460ff1615801561169357506001600160a01b0382166000908152601b602052604090205460ff16155b156116bf5760006116a5826064611ed1565b90506116b18482611edd565b6116bb8183612a16565b9150505b600a5442116116ec576001600160a01b0382166000908152600860205260409020805460ff191660011790555b600f5460ff16156119e1576116ff610f85565b6001600160a01b0316836001600160a01b0316141580156117395750611723610f85565b6001600160a01b0316826001600160a01b031614155b801561174d57506001600160a01b03821615155b801561176457506001600160a01b03821661dead14155b8015611773575060095460ff16155b156119e157600f54610100900460ff166117e2576001600160a01b0383166000908152601b602052604090205460ff16806117c657506001600160a01b0382166000908152601b602052604090205460ff165b6117e25760405162461bcd60e51b81526004016107bf9061236c565b60115460ff1615611884576117f5610f85565b6001600160a01b0316826001600160a01b03161415801561182457506006546001600160a01b03838116911614155b801561183e57506007546001600160a01b03838116911614155b15611884573260009081526010602052604090205443116118715760405162461bcd60e51b81526004016107bf90612696565b3260009081526010602052604090204390555b6001600160a01b0383166000908152601d602052604090205460ff1680156118c557506001600160a01b0382166000908152601c602052604090205460ff16155b1561192557600c548111156118ec5760405162461bcd60e51b81526004016107bf90612641565b600e546118f883610cca565b61190290836129bf565b11156119205760405162461bcd60e51b81526004016107bf90612877565b6119e1565b6001600160a01b0382166000908152601d602052604090205460ff16801561196657506001600160a01b0383166000908152601c602052604090205460ff16155b1561198d57600c548111156119205760405162461bcd60e51b81526004016107bf90612542565b6001600160a01b0382166000908152601c602052604090205460ff166119e157600e546119b983610cca565b6119c390836129bf565b11156119e15760405162461bcd60e51b81526004016107bf90612877565b600f54610100900460ff168015611a0557506007546001600160a01b038381169116145b8015611a2a5750611a14610f85565b6001600160a01b0316836001600160a01b031614155b15611a3457600080fd5b6009546001600160a01b0384166000908152601b602052604090205460ff91821615911680611a7b57506001600160a01b0383166000908152601b602052604090205460ff165b15611a84575060005b60008115611b5d57611aac6064611aa660125486611fce90919063ffffffff16565b90611ed1565b905060125460145482611abf91906129f7565b611ac991906129d7565b60176000828254611ada91906129bf565b9091555050601254601554611aef90836129f7565b611af991906129d7565b60186000828254611b0a91906129bf565b9091555050601254601354611b1f90836129f7565b611b2991906129d7565b60166000828254611b3a91906129bf565b90915550508015611b5057611b50853083611dad565b611b5a8184612a16565b92505b611b68858585611dad565b5050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611bcd82846129bf565b9392505050565b6001600160a01b0382166000818152601d6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611c6b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015611cbf57600080fd5b505afa158015611cd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf79190612001565b81600181518110611d1857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654611d3e91309116846114b8565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611d77908590600090869030904290600401612941565b600060405180830381600087803b158015611d9157600080fd5b505af1158015611da5573d6000803e3d6000fd5b505050505050565b6001600160a01b038316611dd35760405162461bcd60e51b81526004016107bf9061277b565b6001600160a01b038216611df95760405162461bcd60e51b81526004016107bf906122b0565b611e04838383610b0b565b6001600160a01b03831660009081526020819052604090205481811015611e3d5760405162461bcd60e51b81526004016107bf906124fc565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611e749084906129bf565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ebe9190612938565b60405180910390a36115b0848484610b0b565b6000611bcd82846129d7565b6001600160a01b038216611f035760405162461bcd60e51b81526004016107bf9061273a565b611f0f82600083610b0b565b6001600160a01b03821660009081526020819052604090205481811015611f485760405162461bcd60e51b81526004016107bf9061232a565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611f77908490612a16565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611fba908690612938565b60405180910390a3610b0b83600084610b0b565b6000611bcd82846129f7565b803561090281612aaf565b600060208284031215611ff6578081fd5b8135611bcd81612aaf565b600060208284031215612012578081fd5b8151611bcd81612aaf565b6000806040838503121561202f578081fd5b823561203a81612aaf565b9150602083013561204a81612aaf565b809150509250929050565b600080600060608486031215612069578081fd5b833561207481612aaf565b9250602084013561208481612aaf565b929592945050506040919091013590565b600080604083850312156120a7578182fd5b82356120b281612aaf565b9150602083013561204a81612ac4565b600080604083850312156120d4578182fd5b82356120df81612aaf565b946020939093013593505050565b600060208083850312156120ff578182fd5b823567ffffffffffffffff80821115612116578384fd5b818501915085601f830112612129578384fd5b81358181111561213b5761213b612a99565b8381026040518582820101818110858211171561215a5761215a612a99565b604052828152858101935084860182860187018a1015612178578788fd5b8795505b838610156121a15761218d81611fda565b85526001959095019493860193860161217c565b5098975050505050505050565b6000602082840312156121bf578081fd5b8151611bcd81612ac4565b6000602082840312156121db578081fd5b5035919050565b6000602082840312156121f3578081fd5b5051919050565b60008060006060848603121561220e578283fd5b505081359360208301359350604090920135919050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602080835283518082850152825b818110156122895785810183015185820160400152820161226d565b8181111561229a5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601d908201527f4d757374206b656570206665657320617420313025206f72206c657373000000604082015260600190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b6020808252601690820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526024908201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604082015263302e352560e01b606082015260800190565b60208082526039908201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060408201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606082015260800190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526036908201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656040820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606082015260800190565b60208082526035908201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60408201527410181718181892903a37ba30b61039bab838363c9760591b606082015260800190565b60208082526034908201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604082015273371018171a92903a37ba30b61039bab838363c9760611b606082015260800190565b60208082526035908201527f427579207472616e7366657220616d6f756e742065786365656473207468652060408201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606082015260800190565b60208082526049908201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60408201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6060820152681030b63637bbb2b21760b91b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252604d908201527f596f7572206164647265737320686173206265656e206d61726b65642061732060408201527f6120736e697065722c20796f752061726520756e61626c6520746f207472616e60608201526c39b332b91037b91039bbb0b81760991b608082015260a00190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526013908201527213585e081dd85b1b195d08195e18d959591959606a1b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252602f908201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060408201526e6c6f776572207468616e20302e312560881b606082015260800190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156129905784516001600160a01b03168352938301939183019160010161296b565b50506001600160a01b03969096166060850152505050608001529392505050565b60ff91909116815260200190565b600082198211156129d2576129d2612a83565b500190565b6000826129f257634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612a1157612a11612a83565b500290565b600082821015612a2857612a28612a83565b500390565b600281046001821680612a4157607f821691505b60208210811415612a6257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a7c57612a7c612a83565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461097f57600080fd5b801515811461097f57600080fdfea26469706673582212205b2923fce292c1dee3aa8eebfa783cadf4e4130fb0793b00f281f23f65b66e9864736f6c63430008000033
Deployed Bytecode
0x60806040526004361061024a5760003560e01c80637571336a11610139578063c18bc195116100b6578063dd62ed3e1161007a578063dd62ed3e14610638578063df778d2614610658578063e2f456051461066d578063e884f26014610682578063f2fde38b14610697578063f8b45b05146106b757610251565b8063c18bc195146105ae578063c8125e45146105ce578063c876d0b9146105ee578063c8c8ebe414610603578063d257b34f1461061857610251565b80639a7a23d6116100fd5780639a7a23d614610519578063a457c2d714610539578063a9059cbb14610559578063bbc0c74214610579578063c02466681461058e57610251565b80637571336a1461049a57806389476069146104ba5780638a8c523c146104cd5780638da5cb5b146104e257806395d89b411461050457610251565b806323b872dd116101c75780634fbee1931161018b5780634fbee19314610410578063667185241461043057806370a0823114610450578063715018a614610470578063751039fc1461048557610251565b806323b872dd14610391578063313ce567146103b157806339509351146103d35780633ccfd60b146103f35780634a62bb65146103fb57610251565b806313114a9d1161020e57806313114a9d1461030557806317700f011461032757806318160ddd1461033c578063203e727e14610351578063224290851461037157610251565b806306fdde0314610256578063095ea7b3146102815780630b559c6f146102ae5780630f3a325f146102d057806312b77e8a146102f057610251565b3661025157005b600080fd5b34801561026257600080fd5b5061026b6106cc565b604051610278919061225d565b60405180910390f35b34801561028d57600080fd5b506102a161029c3660046120c2565b61075e565b6040516102789190612252565b3480156102ba57600080fd5b506102ce6102c93660046120ed565b610780565b005b3480156102dc57600080fd5b506102a16102eb366004611fe5565b6108e5565b3480156102fc57600080fd5b506102ce610907565b34801561031157600080fd5b5061031a610982565b6040516102789190612938565b34801561033357600080fd5b506102ce610988565b34801561034857600080fd5b5061031a6109d4565b34801561035d57600080fd5b506102ce61036c3660046121ca565b6109da565b34801561037d57600080fd5b506102ce61038c3660046121fa565b610a83565b34801561039d57600080fd5b506102a16103ac366004612055565b610b10565b3480156103bd57600080fd5b506103c6610b3e565b60405161027891906129b1565b3480156103df57600080fd5b506102a16103ee3660046120c2565b610b43565b6102ce610b8f565b34801561040757600080fd5b506102a1610c07565b34801561041c57600080fd5b506102a161042b366004611fe5565b610c10565b34801561043c57600080fd5b506102ce61044b366004611fe5565b610c2e565b34801561045c57600080fd5b5061031a61046b366004611fe5565b610cca565b34801561047c57600080fd5b506102ce610ce5565b34801561049157600080fd5b506102a1610d30565b3480156104a657600080fd5b506102ce6104b5366004612095565b610d81565b6102ce6104c8366004611fe5565b610deb565b3480156104d957600080fd5b506102ce610f27565b3480156104ee57600080fd5b506104f7610f85565b6040516102789190612225565b34801561051057600080fd5b5061026b610f94565b34801561052557600080fd5b506102ce610534366004612095565b610fa3565b34801561054557600080fd5b506102a16105543660046120c2565b61101a565b34801561056557600080fd5b506102a16105743660046120c2565b61107b565b34801561058557600080fd5b506102a1611093565b34801561059a57600080fd5b506102ce6105a9366004612095565b6110a1565b3480156105ba57600080fd5b506102ce6105c93660046121ca565b611140565b3480156105da57600080fd5b506102ce6105e93660046120ed565b6111e9565b3480156105fa57600080fd5b506102a161129e565b34801561060f57600080fd5b5061031a6112a7565b34801561062457600080fd5b506102a16106333660046121ca565b6112ad565b34801561064457600080fd5b5061031a61065336600461201d565b611376565b34801561066457600080fd5b506102ce6113a1565b34801561067957600080fd5b5061031a6113e9565b34801561068e57600080fd5b506102a16113ef565b3480156106a357600080fd5b506102ce6106b2366004611fe5565b611440565b3480156106c357600080fd5b5061031a6114ae565b6060600380546106db90612a2d565b80601f016020809104026020016040519081016040528092919081815260200182805461070790612a2d565b80156107545780601f1061072957610100808354040283529160200191610754565b820191906000526020600020905b81548152906001019060200180831161073757829003601f168201915b5050505050905090565b6000806107696114b4565b90506107768185856114b8565b5060019392505050565b6107886114b4565b6001600160a01b0316610799610f85565b6001600160a01b0316146107c85760405162461bcd60e51b81526004016107bf90612705565b60405180910390fd5b60005b81518110156108e15760075482516001600160a01b039091169083908390811061080557634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614158015610864575060065482516001600160a01b039091169083908390811061085057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614155b156108cf5760016008600084848151811061088f57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806108d981612a68565b9150506107cb565b5050565b6001600160a01b03811660009081526008602052604090205460ff165b919050565b61090f6114b4565b6001600160a01b0316610920610f85565b6001600160a01b0316146109465760405162461bcd60e51b81526004016107bf90612705565b600b546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561097f573d6000803e3d6000fd5b50565b60125481565b6109906114b4565b6001600160a01b03166109a1610f85565b6001600160a01b0316146109c75760405162461bcd60e51b81526004016107bf90612705565b600f805461ff0019169055565b60025490565b6109e26114b4565b6001600160a01b03166109f3610f85565b6001600160a01b031614610a195760405162461bcd60e51b81526004016107bf90612705565b670de0b6b3a76400006103e8610a2d6109d4565b610a389060016129f7565b610a4291906129d7565b610a4c91906129d7565b811015610a6b5760405162461bcd60e51b81526004016107bf906128e9565b610a7d81670de0b6b3a76400006129f7565b600c5550565b610a8b6114b4565b6001600160a01b0316610a9c610f85565b6001600160a01b031614610ac25760405162461bcd60e51b81526004016107bf90612705565b60138390556014829055601581905580610adc83856129bf565b610ae691906129bf565b6012819055600a1015610b0b5760405162461bcd60e51b81526004016107bf906122f3565b505050565b600080610b1b6114b4565b9050610b2885828561156c565b610b338585856115b6565b506001949350505050565b601290565b600080610b4e6114b4565b6001600160a01b038082166000908152600160209081526040808320938916835292905220549091506107769082908690610b8a9087906129bf565b6114b8565b610b976114b4565b6001600160a01b0316610ba8610f85565b6001600160a01b031614610bce5760405162461bcd60e51b81526004016107bf90612705565b601a546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561097f573d6000803e3d6000fd5b600f5460ff1681565b6001600160a01b03166000908152601b602052604090205460ff1690565b610c366114b4565b6001600160a01b0316610c47610f85565b6001600160a01b031614610c6d5760405162461bcd60e51b81526004016107bf90612705565b600b546040516001600160a01b03918216918316907f5deb5ef622431f0df5a39b72dd556892f68ba42aa0f3aaf0800e166ce866492890600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526020819052604090205490565b610ced6114b4565b6001600160a01b0316610cfe610f85565b6001600160a01b031614610d245760405162461bcd60e51b81526004016107bf90612705565b610d2e6000611b6f565b565b6000610d3a6114b4565b6001600160a01b0316610d4b610f85565b6001600160a01b031614610d715760405162461bcd60e51b81526004016107bf90612705565b50600f805460ff19169055600190565b610d896114b4565b6001600160a01b0316610d9a610f85565b6001600160a01b031614610dc05760405162461bcd60e51b81526004016107bf90612705565b6001600160a01b03919091166000908152601c60205260409020805460ff1916911515919091179055565b610df36114b4565b6001600160a01b0316610e04610f85565b6001600160a01b031614610e2a5760405162461bcd60e51b81526004016107bf90612705565b601a546040516370a0823160e01b815282916001600160a01b038084169263a9059cbb929091169083906370a0823190610e68903090600401612225565b60206040518083038186803b158015610e8057600080fd5b505afa158015610e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb891906121e2565b6040518363ffffffff1660e01b8152600401610ed5929190612239565b602060405180830381600087803b158015610eef57600080fd5b505af1158015610f03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0b91906121ae565b610f2f6114b4565b6001600160a01b0316610f40610f85565b6001600160a01b031614610f665760405162461bcd60e51b81526004016107bf90612705565b600f805461ff001916610100179055610f80426002611bc1565b600a55565b6005546001600160a01b031690565b6060600480546106db90612a2d565b610fab6114b4565b6001600160a01b0316610fbc610f85565b6001600160a01b031614610fe25760405162461bcd60e51b81526004016107bf90612705565b6007546001600160a01b03838116911614156110105760405162461bcd60e51b81526004016107bf90612468565b6108e18282611bd4565b6000806110256114b4565b6001600160a01b038082166000908152600160209081526040808320938916835292905220549091508381101561106e5760405162461bcd60e51b81526004016107bf906128a4565b610b3382868684036114b8565b6000806110866114b4565b90506107768185856115b6565b600f54610100900460ff1681565b6110a96114b4565b6001600160a01b03166110ba610f85565b6001600160a01b0316146110e05760405162461bcd60e51b81526004016107bf90612705565b6001600160a01b0382166000818152601b602052604090819020805460ff1916841515179055517f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df790611134908490612252565b60405180910390a25050565b6111486114b4565b6001600160a01b0316611159610f85565b6001600160a01b03161461117f5760405162461bcd60e51b81526004016107bf90612705565b670de0b6b3a76400006103e86111936109d4565b61119e9060056129f7565b6111a891906129d7565b6111b291906129d7565b8110156111d15760405162461bcd60e51b81526004016107bf90612424565b6111e381670de0b6b3a76400006129f7565b600e5550565b6111f16114b4565b6001600160a01b0316611202610f85565b6001600160a01b0316146112285760405162461bcd60e51b81526004016107bf90612705565b60005b81518110156108e15760006008600084848151811061125a57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061129681612a68565b91505061122b565b60115460ff1681565b600c5481565b60006112b76114b4565b6001600160a01b03166112c8610f85565b6001600160a01b0316146112ee5760405162461bcd60e51b81526004016107bf90612705565b620186a06112fa6109d4565b6113059060016129f7565b61130f91906129d7565b82101561132e5760405162461bcd60e51b81526004016107bf90612598565b6103e86113396109d4565b6113449060056129f7565b61134e91906129d7565b82111561136d5760405162461bcd60e51b81526004016107bf906125ed565b50600d55600190565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6113a96114b4565b6001600160a01b03166113ba610f85565b6001600160a01b0316146113e05760405162461bcd60e51b81526004016107bf90612705565b61094647611c28565b600d5481565b60006113f96114b4565b6001600160a01b031661140a610f85565b6001600160a01b0316146114305760405162461bcd60e51b81526004016107bf90612705565b506011805460ff19169055600190565b6114486114b4565b6001600160a01b0316611459610f85565b6001600160a01b03161461147f5760405162461bcd60e51b81526004016107bf90612705565b6001600160a01b0381166114a55760405162461bcd60e51b81526004016107bf9061239c565b61097f81611b6f565b600e5481565b3390565b6001600160a01b0383166114de5760405162461bcd60e51b81526004016107bf90612833565b6001600160a01b0382166115045760405162461bcd60e51b81526004016107bf906123e2565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061155f908590612938565b60405180910390a3505050565b60006115788484611376565b905060001981146115b057818110156115a35760405162461bcd60e51b81526004016107bf906124c5565b6115b084848484036114b8565b50505050565b6001600160a01b0383166115dc5760405162461bcd60e51b81526004016107bf9061277b565b6001600160a01b0382166116025760405162461bcd60e51b81526004016107bf906122b0565b6001600160a01b03831660009081526008602052604090205460ff161561163b5760405162461bcd60e51b81526004016107bf906127c0565b806116515761164c83836000611dad565b610b0b565b6001600160a01b0383166000908152601b602052604090205460ff1615801561169357506001600160a01b0382166000908152601b602052604090205460ff16155b156116bf5760006116a5826064611ed1565b90506116b18482611edd565b6116bb8183612a16565b9150505b600a5442116116ec576001600160a01b0382166000908152600860205260409020805460ff191660011790555b600f5460ff16156119e1576116ff610f85565b6001600160a01b0316836001600160a01b0316141580156117395750611723610f85565b6001600160a01b0316826001600160a01b031614155b801561174d57506001600160a01b03821615155b801561176457506001600160a01b03821661dead14155b8015611773575060095460ff16155b156119e157600f54610100900460ff166117e2576001600160a01b0383166000908152601b602052604090205460ff16806117c657506001600160a01b0382166000908152601b602052604090205460ff165b6117e25760405162461bcd60e51b81526004016107bf9061236c565b60115460ff1615611884576117f5610f85565b6001600160a01b0316826001600160a01b03161415801561182457506006546001600160a01b03838116911614155b801561183e57506007546001600160a01b03838116911614155b15611884573260009081526010602052604090205443116118715760405162461bcd60e51b81526004016107bf90612696565b3260009081526010602052604090204390555b6001600160a01b0383166000908152601d602052604090205460ff1680156118c557506001600160a01b0382166000908152601c602052604090205460ff16155b1561192557600c548111156118ec5760405162461bcd60e51b81526004016107bf90612641565b600e546118f883610cca565b61190290836129bf565b11156119205760405162461bcd60e51b81526004016107bf90612877565b6119e1565b6001600160a01b0382166000908152601d602052604090205460ff16801561196657506001600160a01b0383166000908152601c602052604090205460ff16155b1561198d57600c548111156119205760405162461bcd60e51b81526004016107bf90612542565b6001600160a01b0382166000908152601c602052604090205460ff166119e157600e546119b983610cca565b6119c390836129bf565b11156119e15760405162461bcd60e51b81526004016107bf90612877565b600f54610100900460ff168015611a0557506007546001600160a01b038381169116145b8015611a2a5750611a14610f85565b6001600160a01b0316836001600160a01b031614155b15611a3457600080fd5b6009546001600160a01b0384166000908152601b602052604090205460ff91821615911680611a7b57506001600160a01b0383166000908152601b602052604090205460ff165b15611a84575060005b60008115611b5d57611aac6064611aa660125486611fce90919063ffffffff16565b90611ed1565b905060125460145482611abf91906129f7565b611ac991906129d7565b60176000828254611ada91906129bf565b9091555050601254601554611aef90836129f7565b611af991906129d7565b60186000828254611b0a91906129bf565b9091555050601254601354611b1f90836129f7565b611b2991906129d7565b60166000828254611b3a91906129bf565b90915550508015611b5057611b50853083611dad565b611b5a8184612a16565b92505b611b68858585611dad565b5050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611bcd82846129bf565b9392505050565b6001600160a01b0382166000818152601d6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611c6b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015611cbf57600080fd5b505afa158015611cd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf79190612001565b81600181518110611d1857634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654611d3e91309116846114b8565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790611d77908590600090869030904290600401612941565b600060405180830381600087803b158015611d9157600080fd5b505af1158015611da5573d6000803e3d6000fd5b505050505050565b6001600160a01b038316611dd35760405162461bcd60e51b81526004016107bf9061277b565b6001600160a01b038216611df95760405162461bcd60e51b81526004016107bf906122b0565b611e04838383610b0b565b6001600160a01b03831660009081526020819052604090205481811015611e3d5760405162461bcd60e51b81526004016107bf906124fc565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290611e749084906129bf565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611ebe9190612938565b60405180910390a36115b0848484610b0b565b6000611bcd82846129d7565b6001600160a01b038216611f035760405162461bcd60e51b81526004016107bf9061273a565b611f0f82600083610b0b565b6001600160a01b03821660009081526020819052604090205481811015611f485760405162461bcd60e51b81526004016107bf9061232a565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611f77908490612a16565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611fba908690612938565b60405180910390a3610b0b83600084610b0b565b6000611bcd82846129f7565b803561090281612aaf565b600060208284031215611ff6578081fd5b8135611bcd81612aaf565b600060208284031215612012578081fd5b8151611bcd81612aaf565b6000806040838503121561202f578081fd5b823561203a81612aaf565b9150602083013561204a81612aaf565b809150509250929050565b600080600060608486031215612069578081fd5b833561207481612aaf565b9250602084013561208481612aaf565b929592945050506040919091013590565b600080604083850312156120a7578182fd5b82356120b281612aaf565b9150602083013561204a81612ac4565b600080604083850312156120d4578182fd5b82356120df81612aaf565b946020939093013593505050565b600060208083850312156120ff578182fd5b823567ffffffffffffffff80821115612116578384fd5b818501915085601f830112612129578384fd5b81358181111561213b5761213b612a99565b8381026040518582820101818110858211171561215a5761215a612a99565b604052828152858101935084860182860187018a1015612178578788fd5b8795505b838610156121a15761218d81611fda565b85526001959095019493860193860161217c565b5098975050505050505050565b6000602082840312156121bf578081fd5b8151611bcd81612ac4565b6000602082840312156121db578081fd5b5035919050565b6000602082840312156121f3578081fd5b5051919050565b60008060006060848603121561220e578283fd5b505081359360208301359350604090920135919050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602080835283518082850152825b818110156122895785810183015185820160400152820161226d565b8181111561229a5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252601d908201527f4d757374206b656570206665657320617420313025206f72206c657373000000604082015260600190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b6020808252601690820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526024908201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604082015263302e352560e01b606082015260800190565b60208082526039908201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060408201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000606082015260800190565b6020808252601d908201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604082015260600190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526036908201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656040820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b606082015260800190565b60208082526035908201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60408201527410181718181892903a37ba30b61039bab838363c9760591b606082015260800190565b60208082526034908201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604082015273371018171a92903a37ba30b61039bab838363c9760611b606082015260800190565b60208082526035908201527f427579207472616e7366657220616d6f756e742065786365656473207468652060408201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b606082015260800190565b60208082526049908201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60408201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6060820152681030b63637bbb2b21760b91b608082015260a00190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252604d908201527f596f7572206164647265737320686173206265656e206d61726b65642061732060408201527f6120736e697065722c20796f752061726520756e61626c6520746f207472616e60608201526c39b332b91037b91039bbb0b81760991b608082015260a00190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526013908201527213585e081dd85b1b195d08195e18d959591959606a1b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252602f908201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060408201526e6c6f776572207468616e20302e312560881b606082015260800190565b90815260200190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156129905784516001600160a01b03168352938301939183019160010161296b565b50506001600160a01b03969096166060850152505050608001529392505050565b60ff91909116815260200190565b600082198211156129d2576129d2612a83565b500190565b6000826129f257634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615612a1157612a11612a83565b500290565b600082821015612a2857612a28612a83565b500390565b600281046001821680612a4157607f821691505b60208210811415612a6257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a7c57612a7c612a83565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461097f57600080fd5b801515811461097f57600080fdfea26469706673582212205b2923fce292c1dee3aa8eebfa783cadf4e4130fb0793b00f281f23f65b66e9864736f6c63430008000033
Deployed Bytecode Sourcemap
352:15929:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2196:100:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4688:242;;;;;;;;;;-1:-1:-1;4688:242:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7318:373:1:-;;;;;;;;;;-1:-1:-1;7318:373:1;;;;;:::i;:::-;;:::i;:::-;;7913:105;;;;;;;;;;-1:-1:-1;7913:105:1;;;;;:::i;:::-;;:::i;15702:109::-;;;;;;;;;;;;;:::i;1090:24::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4194:85::-;;;;;;;;;;;;;:::i;3316:108:2:-;;;;;;;;;;;;;:::i;5223:271:1:-;;;;;;;;;;-1:-1:-1;5223:271:1;;;;;:::i;:::-;;:::i;5937:376::-;;;;;;;;;;-1:-1:-1;5937:376:1;;;;;:::i;:::-;;:::i;5510:295:2:-;;;;;;;;;;-1:-1:-1;5510:295:2;;;;;:::i;:::-;;:::i;3158:93::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;6214:272::-;;;;;;;;;;-1:-1:-1;6214:272:2;;;;;:::i;:::-;;:::i;15819:218:1:-;;;:::i;782:33::-;;;;;;;;;;;;;:::i;7184:126::-;;;;;;;;;;-1:-1:-1;7184:126:1;;;;;:::i;:::-;;:::i;7019:157::-;;;;;;;;;;-1:-1:-1;7019:157:1;;;;;:::i;:::-;;:::i;3487:177:2:-;;;;;;;;;;-1:-1:-1;3487:177:2;;;;;:::i;:::-;;:::i;1739:103:9:-;;;;;;;;;;;;;:::i;4331:121:1:-;;;;;;;;;;;;;:::i;5762:167::-;;;;;;;;;;-1:-1:-1;5762:167:1;;;;;:::i;:::-;;:::i;16045:196::-;;;;;;:::i;:::-;;:::i;4056:130::-;;;;;;;;;;;;;:::i;1088:87:9:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2415:104:2:-;;;;;;;;;;;;;:::i;6511:304:1:-;;;;;;;;;;-1:-1:-1;6511:304:1;;;;;:::i;:::-;;:::i;6989:507:2:-;;;;;;;;;;-1:-1:-1;6989:507:2;;;;;:::i;:::-;;:::i;3870:234::-;;;;;;;;;;-1:-1:-1;3870:234:2;;;;;:::i;:::-;;:::i;822:33:1:-;;;;;;;;;;;;;:::i;6321:182::-;;;;;;;;;;-1:-1:-1;6321:182:1;;;;;:::i;:::-;;:::i;5502:252::-;;;;;;;;;;-1:-1:-1;5502:252:1;;;;;:::i;:::-;;:::i;7699:206::-;;;;;;;;;;-1:-1:-1;7699:206:1;;;;;:::i;:::-;;:::i;1042:39::-;;;;;;;;;;;;;:::i;667:35::-;;;;;;;;;;;;;:::i;4718:497::-;;;;;;;;;;-1:-1:-1;4718:497:1;;;;;:::i;:::-;;:::i;4167:201:2:-;;;;;;;;;;-1:-1:-1;4167:201:2;;;;;:::i;:::-;;:::i;15534:160:1:-;;;;;;;;;;;;;:::i;709:33::-;;;;;;;;;;;;;:::i;4513:135::-;;;;;;;;;;;;;:::i;1997:238:9:-;;;;;;;;;;-1:-1:-1;1997:238:9;;;;;:::i;:::-;;:::i;749:24:1:-;;;;;;;;;;;;;:::i;2196:100:2:-;2250:13;2283:5;2276:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2196:100;:::o;4688:242::-;4807:4;4829:13;4845:12;:10;:12::i;:::-;4829:28;;4868:32;4877:5;4884:7;4893:6;4868:8;:32::i;:::-;-1:-1:-1;4918:4:2;;4688:242;-1:-1:-1;;;4688:242:2:o;7318:373:1:-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;;;;;;;;;7406:9:1::1;7401:283;7425:12;:19;7421:1;:23;7401:283;;;7507:13;::::0;7488:15;;-1:-1:-1;;;;;7507:13:1;;::::1;::::0;7488:12;;7501:1;;7488:15;::::1;;;-1:-1:-1::0;;;7488:15:1::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;7488:32:1::1;;;:96;;;;-1:-1:-1::0;7568:15:1::1;::::0;7541;;-1:-1:-1;;;;;7568:15:1;;::::1;::::0;7541:12;;7554:1;;7541:15;::::1;;;-1:-1:-1::0;;;7541:15:1::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;7541:43:1::1;;;7488:96;7466:207;;;7653:4;7619:14;:31;7634:12;7647:1;7634:15;;;;;;-1:-1:-1::0;;;7634:15:1::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;7619:31:1::1;-1:-1:-1::0;;;;;7619:31:1::1;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;7466:207;7446:3:::0;::::1;::::0;::::1;:::i;:::-;;;;7401:283;;;;7318:373:::0;:::o;7913:105::-;-1:-1:-1;;;;;7990:20:1;;7966:4;7990:20;;;:14;:20;;;;;;;;7913:105;;;;:::o;15702:109::-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;15761:9:1::1;::::0;15753:50:::1;::::0;-1:-1:-1;;;;;15761:9:1;;::::1;::::0;15781:21:::1;15753:50:::0;::::1;;;::::0;15761:9:::1;15753:50:::0;15761:9;15753:50;15781:21;15761:9;15753:50;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;15702:109::o:0;1090:24::-;;;;:::o;4194:85::-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;4250:13:1::1;:21:::0;;-1:-1:-1;;4250:21:1::1;::::0;;4194:85::o;3316:108:2:-;3404:12;;3316:108;:::o;5223:271:1:-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;5360:4:1::1;5352;5331:13;:11;:13::i;:::-;:17;::::0;5347:1:::1;5331:17;:::i;:::-;5330:26;;;;:::i;:::-;5329:35;;;;:::i;:::-;5319:6;:45;;5297:142;;;;-1:-1:-1::0;;;5297:142:1::1;;;;;;;:::i;:::-;5473:13;:6:::0;5482:4:::1;5473:13;:::i;:::-;5450:20;:36:::0;-1:-1:-1;5223:271:1:o;5937:376::-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;6081:13:1::1;:28:::0;;;6120:13:::1;:28:::0;;;6159:7:::1;:16:::0;;;6169:6;6198:29:::1;6136:12:::0;6097;6198:29:::1;:::i;:::-;:39;;;;:::i;:::-;6186:9;:51:::0;;;6269:2:::1;-1:-1:-1::0;6256:15:1::1;6248:57;;;;-1:-1:-1::0;;;6248:57:1::1;;;;;;;:::i;:::-;5937:376:::0;;;:::o;5510:295:2:-;5641:4;5658:15;5676:12;:10;:12::i;:::-;5658:30;;5699:38;5715:4;5721:7;5730:6;5699:15;:38::i;:::-;5748:27;5758:4;5764:2;5768:6;5748:9;:27::i;:::-;-1:-1:-1;5793:4:2;;5510:295;-1:-1:-1;;;;5510:295:2:o;3158:93::-;3241:2;3158:93;:::o;6214:272::-;6329:4;6351:13;6367:12;:10;:12::i;:::-;-1:-1:-1;;;;;6415:18:2;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;6351:28;;-1:-1:-1;6390:66:2;;6351:28;;6406:7;;6415:40;;6445:10;;6415:40;:::i;:::-;6390:8;:66::i;15819:218:1:-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;15984:13:1::1;::::0;:45:::1;::::0;-1:-1:-1;;;;;15984:13:1;;::::1;::::0;16007:21:::1;15984:45:::0;::::1;;;::::0;:13:::1;:45:::0;:13;:45;16007:21;15984:13;:45;::::1;;;;;;;;;;;;;::::0;::::1;;;;782:33:::0;;;;;;:::o;7184:126::-;-1:-1:-1;;;;;7274:28:1;7250:4;7274:28;;;:19;:28;;;;;;;;;7184:126::o;7019:157::-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;7126:9:1::1;::::0;7098:38:::1;::::0;-1:-1:-1;;;;;7126:9:1;;::::1;::::0;7098:38;::::1;::::0;::::1;::::0;7126:9:::1;::::0;7098:38:::1;7147:9;:21:::0;;-1:-1:-1;;;;;;7147:21:1::1;-1:-1:-1::0;;;;;7147:21:1;;;::::1;::::0;;;::::1;::::0;;7019:157::o;3487:177:2:-;-1:-1:-1;;;;;3638:18:2;3606:7;3638:18;;;;;;;;;;;;3487:177::o;1739:103:9:-;1319:12;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;1804:30:::1;1831:1;1804:18;:30::i;:::-;1739:103::o:0;4331:121:1:-;4383:4;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;-1:-1:-1;4400:14:1::1;:22:::0;;-1:-1:-1;;4400:22:1::1;::::0;;;4331:121;:::o;5762:167::-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;5875:39:1;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;5875:46:1::1;::::0;::::1;;::::0;;;::::1;::::0;;5762:167::o;16045:196::-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;16187:13:1::1;::::0;16202:30:::1;::::0;-1:-1:-1;;;16202:30:1;;16148:12;;-1:-1:-1;;;;;16172:14:1;;::::1;::::0;::::1;::::0;16187:13;;::::1;::::0;16172:14;;16202:15:::1;::::0;:30:::1;::::0;16226:4:::1;::::0;16202:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16172:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4056:130::-:0;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;4111:13:1::1;:20:::0;;-1:-1:-1;;4111:20:1::1;;;::::0;;4156:22:::1;:15;4176:1;4156:19;:22::i;:::-;4142:11;:36:::0;4056:130::o;1088:87:9:-;1161:6;;-1:-1:-1;;;;;1161:6:9;1088:87;:::o;2415:104:2:-;2471:13;2504:7;2497:14;;;;;:::i;6511:304:1:-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;6655:13:1::1;::::0;-1:-1:-1;;;;;6647:21:1;;::::1;6655:13:::0;::::1;6647:21;;6625:128;;;;-1:-1:-1::0;;;6625:128:1::1;;;;;;;:::i;:::-;6766:41;6795:4;6801:5;6766:28;:41::i;6989:507:2:-:0;7109:4;7131:13;7147:12;:10;:12::i;:::-;-1:-1:-1;;;;;7197:18:2;;;7170:24;7197:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;7131:28;;-1:-1:-1;7257:35:2;;;;7235:122;;;;-1:-1:-1;;;7235:122:2;;;;;;;:::i;:::-;7393:60;7402:5;7409:7;7437:15;7418:16;:34;7393:8;:60::i;3870:234::-;3985:4;4007:13;4023:12;:10;:12::i;:::-;4007:28;;4046;4056:5;4063:2;4067:6;4046:9;:28::i;822:33:1:-;;;;;;;;;:::o;6321:182::-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;6406:28:1;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;:39;;-1:-1:-1;;6406:39:1::1;::::0;::::1;;;::::0;;6461:34;::::1;::::0;::::1;::::0;6406:39;;6461:34:::1;:::i;:::-;;;;;;;;6321:182:::0;;:::o;5502:252::-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;5642:4:1::1;5634;5613:13;:11;:13::i;:::-;:17;::::0;5629:1:::1;5613:17;:::i;:::-;5612:26;;;;:::i;:::-;5611:35;;;;:::i;:::-;5601:6;:45;;5579:131;;;;-1:-1:-1::0;;;5579:131:1::1;;;;;;;:::i;:::-;5733:13;:6:::0;5742:4:::1;5733:13;:::i;:::-;5721:9;:25:::0;-1:-1:-1;5502:252:1:o;7699:206::-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;7787:9:1::1;7782:116;7806:12;:19;7802:1;:23;7782:116;;;7881:5;7847:14;:31;7862:12;7875:1;7862:15;;;;;;-1:-1:-1::0;;;7862:15:1::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;7847:31:1::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;7847:31:1;:39;;-1:-1:-1;;7847:39:1::1;::::0;::::1;;::::0;;;::::1;::::0;;7827:3;::::1;::::0;::::1;:::i;:::-;;;;7782:116;;1042:39:::0;;;;;;:::o;667:35::-;;;;:::o;4718:497::-;4826:4;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;4905:6:1::1;4884:13;:11;:13::i;:::-;:17;::::0;4900:1:::1;4884:17;:::i;:::-;4883:28;;;;:::i;:::-;4870:9;:41;;4848:144;;;;-1:-1:-1::0;;;4848:144:1::1;;;;;;;:::i;:::-;5060:4;5039:13;:11;:13::i;:::-;:17;::::0;5055:1:::1;5039:17;:::i;:::-;5038:26;;;;:::i;:::-;5025:9;:39;;5003:141;;;;-1:-1:-1::0;;;5003:141:1::1;;;;;;;:::i;:::-;-1:-1:-1::0;5155:18:1::1;:30:::0;5203:4:::1;::::0;4718:497::o;4167:201:2:-;-1:-1:-1;;;;;4333:18:2;;;4301:7;4333:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4167:201::o;15534:160:1:-;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;15585:40:1::1;15603:21;15585:17;:40::i;709:33::-:0;;;;:::o;4513:135::-;4573:4;1319:12:9;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;-1:-1:-1;4590:20:1::1;:28:::0;;-1:-1:-1;;4590:28:1::1;::::0;;;4513:135;:::o;1997:238:9:-;1319:12;:10;:12::i;:::-;-1:-1:-1;;;;;1308:23:9;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1308:23:9;;1300:68;;;;-1:-1:-1;;;1300:68:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;2100:22:9;::::1;2078:110;;;;-1:-1:-1::0;;;2078:110:9::1;;;;;;;:::i;:::-;2199:28;2218:8;2199:18;:28::i;749:24:1:-:0;;;;:::o;656:98:0:-;736:10;656:98;:::o;10731:380:2:-;-1:-1:-1;;;;;10867:19:2;;10859:68;;;;-1:-1:-1;;;10859:68:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;10946:21:2;;10938:68;;;;-1:-1:-1;;;10938:68:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;11019:18:2;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;11071:32;;;;;11049:6;;11071:32;:::i;:::-;;;;;;;;10731:380;;;:::o;11398:502::-;11533:24;11560:25;11570:5;11577:7;11560:9;:25::i;:::-;11533:52;;-1:-1:-1;;11600:16:2;:37;11596:297;;11700:6;11680:16;:26;;11654:117;;;;-1:-1:-1;;;11654:117:2;;;;;;;:::i;:::-;11815:51;11824:5;11831:7;11859:6;11840:16;:25;11815:8;:51::i;:::-;11398:502;;;;:::o;8026:4759:1:-;-1:-1:-1;;;;;8158:18:1;;8150:68;;;;-1:-1:-1;;;8150:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;8237:16:1;;8229:64;;;;-1:-1:-1;;;8229:64:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;8327:20:1;;;;;;:14;:20;;;;;;;;8326:21;8304:148;;;;-1:-1:-1;;;8304:148:1;;;;;;;:::i;:::-;8469:11;8465:93;;8497:28;8513:4;8519:2;8523:1;8497:15;:28::i;:::-;8540:7;;8465:93;-1:-1:-1;;;;;8608:25:1;;;;;;:19;:25;;;;;;;;8607:26;:54;;;;-1:-1:-1;;;;;;8638:23:1;;;;;;:19;:23;;;;;;;;8637:24;8607:54;8603:196;;;8678:18;8699:15;:6;8710:3;8699:10;:15::i;:::-;8678:36;;8729:23;8735:4;8741:10;8729:5;:23::i;:::-;8767:20;8777:10;8767:20;;:::i;:::-;;;8603:196;;8834:11;;8815:15;:30;8811:61;;-1:-1:-1;;;;;8847:18:1;;;;;;:14;:18;;;;;:25;;-1:-1:-1;;8847:25:1;8868:4;8847:25;;;8811:61;8889:14;;;;8885:2490;;;8950:7;:5;:7::i;:::-;-1:-1:-1;;;;;8942:15:1;:4;-1:-1:-1;;;;;8942:15:1;;;:49;;;;;8984:7;:5;:7::i;:::-;-1:-1:-1;;;;;8978:13:1;:2;-1:-1:-1;;;;;8978:13:1;;;8942:49;:86;;;;-1:-1:-1;;;;;;9012:16:1;;;;8942:86;:128;;;;-1:-1:-1;;;;;;9049:21:1;;9063:6;9049:21;;8942:128;:159;;;;-1:-1:-1;9092:9:1;;;;9091:10;8942:159;8920:2444;;;9141:13;;;;;;;9136:223;;-1:-1:-1;;;;;9213:25:1;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;9242:23:1;;;;;;:19;:23;;;;;;;;9213:52;9179:160;;;;-1:-1:-1;;;9179:160:1;;;;;;;:::i;:::-;9515:20;;;;9511:641;;;9596:7;:5;:7::i;:::-;-1:-1:-1;;;;;9590:13:1;:2;-1:-1:-1;;;;;9590:13:1;;;:72;;;;-1:-1:-1;9646:15:1;;-1:-1:-1;;;;;9632:30:1;;;9646:15;;9632:30;;9590:72;:129;;;;-1:-1:-1;9705:13:1;;-1:-1:-1;;;;;9691:28:1;;;9705:13;;9691:28;;9590:129;9560:573;;;9837:9;9808:39;;;;:28;:39;;;;;;9883:12;-1:-1:-1;9770:258:1;;;;-1:-1:-1;;;9770:258:1;;;;;;;:::i;:::-;10084:9;10055:39;;;;:28;:39;;;;;10097:12;10055:54;;9560:573;-1:-1:-1;;;;;10227:31:1;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;10284:35:1;;;;;;:31;:35;;;;;;;;10283:36;10227:92;10201:1148;;;10406:20;;10396:6;:30;;10362:169;;;;-1:-1:-1;;;10362:169:1;;;;;;;:::i;:::-;10614:9;;10597:13;10607:2;10597:9;:13::i;:::-;10588:22;;:6;:22;:::i;:::-;:35;;10554:140;;;;-1:-1:-1;;;10554:140:1;;;;;;;:::i;:::-;10201:1148;;;-1:-1:-1;;;;;10793:29:1;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;10848:37:1;;;;;;:31;:37;;;;;;;;10847:38;10793:92;10767:582;;;10972:20;;10962:6;:30;;10928:170;;;;-1:-1:-1;;;10928:170:1;;;;;;;:::i;10767:582::-;-1:-1:-1;;;;;11129:35:1;;;;;;:31;:35;;;;;;;;11124:225;;11249:9;;11232:13;11242:2;11232:9;:13::i;:::-;11223:22;;:6;:22;:::i;:::-;:35;;11189:140;;;;-1:-1:-1;;;11189:140:1;;;;;;;:::i;:::-;11460:13;;;;;;;:36;;;;-1:-1:-1;11483:13:1;;-1:-1:-1;;;;;11477:19:1;;;11483:13;;11477:19;11460:36;:55;;;;;11508:7;:5;:7::i;:::-;-1:-1:-1;;;;;11500:15:1;:4;-1:-1:-1;;;;;11500:15:1;;;11460:55;11456:96;;;11532:8;;;11456:96;11993:9;;-1:-1:-1;;;;;12104:25:1;;11977:12;12104:25;;;:19;:25;;;;;;11993:9;;;;11992:10;;12104:25;;:52;;-1:-1:-1;;;;;;12133:23:1;;;;;;:19;:23;;;;;;;;12104:52;12100:100;;;-1:-1:-1;12183:5:1;12100:100;12212:12;12317:7;12313:419;;;12348:30;12374:3;12348:21;12359:9;;12348:6;:10;;:21;;;;:::i;:::-;:25;;:30::i;:::-;12341:37;;12441:9;;12424:13;;12417:4;:20;;;;:::i;:::-;12416:34;;;;:::i;:::-;12393:19;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;12501:9:1;;12490:7;;12483:14;;:4;:14;:::i;:::-;12482:28;;;;:::i;:::-;12465:13;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;12573:9:1;;12556:13;;12549:20;;:4;:20;:::i;:::-;12548:34;;;;:::i;:::-;12525:19;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;12603:8:1;;12599:91;;12632:42;12648:4;12662;12669;12632:15;:42::i;:::-;12706:14;12716:4;12706:14;;:::i;:::-;;;12313:419;12744:33;12760:4;12766:2;12770:6;12744:15;:33::i;:::-;8026:4759;;;;;:::o;2395:191:9:-;2488:6;;;-1:-1:-1;;;;;2505:17:9;;;-1:-1:-1;;;;;;2505:17:9;;;;;;;2538:40;;2488:6;;;2505:17;2488:6;;2538:40;;2469:16;;2538:40;2395:191;;:::o;2993:98:10:-;3051:7;3078:5;3082:1;3078;:5;:::i;:::-;3071:12;2993:98;-1:-1:-1;;;2993:98:10:o;6823:188:1:-;-1:-1:-1;;;;;6906:31:1;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;6906:39:1;;;;;;;;;;6963:40;;6906:39;;:31;6963:40;;;6823:188;;:::o;12793:590::-;12944:16;;;12958:1;12944:16;;;;;;;;12920:21;;12944:16;;;;;;;;;;-1:-1:-1;12944:16:1;12920:40;;12989:4;12971;12976:1;12971:7;;;;;;-1:-1:-1;;;12971:7:1;;;;;;;;;-1:-1:-1;;;;;12971:23:1;;;:7;;;;;;;;;;:23;;;;13015:15;;:22;;;-1:-1:-1;;;13015:22:1;;;;:15;;;;;:20;;:22;;;;;12971:7;;13015:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13005:4;13010:1;13005:7;;;;;;-1:-1:-1;;;13005:7:1;;;;;;;;;-1:-1:-1;;;;;13005:32:1;;;:7;;;;;;;;;:32;13082:15;;13050:62;;13067:4;;13082:15;13100:11;13050:8;:62::i;:::-;13151:15;;:224;;-1:-1:-1;;;13151:224:1;;-1:-1:-1;;;;;13151:15:1;;;;:66;;:224;;13232:11;;13151:15;;13302:4;;13329;;13349:15;;13151:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12793:590;;:::o;7975:708:2:-;-1:-1:-1;;;;;8106:18:2;;8098:68;;;;-1:-1:-1;;;8098:68:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;8185:16:2;;8177:64;;;;-1:-1:-1;;;8177:64:2;;;;;;;:::i;:::-;8254:38;8275:4;8281:2;8285:6;8254:20;:38::i;:::-;-1:-1:-1;;;;;8327:15:2;;8305:19;8327:15;;;;;;;;;;;8375:21;;;;8353:109;;;;-1:-1:-1;;;8353:109:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;8498:15:2;;;:9;:15;;;;;;;;;;;8516:20;;;8498:38;;8558:13;;;;;;;;:23;;8530:6;;8498:9;8558:23;;8530:6;;8558:23;:::i;:::-;;;;;;;;8614:2;-1:-1:-1;;;;;8599:26:2;8608:4;-1:-1:-1;;;;;8599:26:2;;8618:6;8599:26;;;;;;:::i;:::-;;;;;;;;8638:37;8658:4;8664:2;8668:6;8638:19;:37::i;4130:98:10:-;4188:7;4215:5;4219:1;4215;:5;:::i;9702:591:2:-;-1:-1:-1;;;;;9786:21:2;;9778:67;;;;-1:-1:-1;;;9778:67:2;;;;;;;:::i;:::-;9858:49;9879:7;9896:1;9900:6;9858:20;:49::i;:::-;-1:-1:-1;;;;;9945:18:2;;9920:22;9945:18;;;;;;;;;;;9982:24;;;;9974:71;;;;-1:-1:-1;;;9974:71:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;10081:18:2;;:9;:18;;;;;;;;;;10102:23;;;10081:44;;10147:12;:22;;10119:6;;10081:9;10147:22;;10119:6;;10147:22;:::i;:::-;;;;-1:-1:-1;;10187:37:2;;10213:1;;-1:-1:-1;;;;;10187:37:2;;;;;;;10217:6;;10187:37;:::i;:::-;;;;;;;;10237:48;10257:7;10274:1;10278:6;10237:19;:48::i;3731:98:10:-;3789:7;3816:5;3820:1;3816;:5;:::i;14:138:11:-;84:20;;113:33;84:20;113:33;:::i;157:259::-;;269:2;257:9;248:7;244:23;240:32;237:2;;;290:6;282;275:22;237:2;334:9;321:23;353:33;380:5;353:33;:::i;421:263::-;;544:2;532:9;523:7;519:23;515:32;512:2;;;565:6;557;550:22;512:2;602:9;596:16;621:33;648:5;621:33;:::i;689:402::-;;;818:2;806:9;797:7;793:23;789:32;786:2;;;839:6;831;824:22;786:2;883:9;870:23;902:33;929:5;902:33;:::i;:::-;954:5;-1:-1:-1;1011:2:11;996:18;;983:32;1024:35;983:32;1024:35;:::i;:::-;1078:7;1068:17;;;776:315;;;;;:::o;1096:470::-;;;;1242:2;1230:9;1221:7;1217:23;1213:32;1210:2;;;1263:6;1255;1248:22;1210:2;1307:9;1294:23;1326:33;1353:5;1326:33;:::i;:::-;1378:5;-1:-1:-1;1435:2:11;1420:18;;1407:32;1448:35;1407:32;1448:35;:::i;:::-;1200:366;;1502:7;;-1:-1:-1;;;1556:2:11;1541:18;;;;1528:32;;1200:366::o;1571:396::-;;;1697:2;1685:9;1676:7;1672:23;1668:32;1665:2;;;1718:6;1710;1703:22;1665:2;1762:9;1749:23;1781:33;1808:5;1781:33;:::i;:::-;1833:5;-1:-1:-1;1890:2:11;1875:18;;1862:32;1903;1862;1903;:::i;1972:327::-;;;2101:2;2089:9;2080:7;2076:23;2072:32;2069:2;;;2122:6;2114;2107:22;2069:2;2166:9;2153:23;2185:33;2212:5;2185:33;:::i;:::-;2237:5;2289:2;2274:18;;;;2261:32;;-1:-1:-1;;;2059:240:11:o;2304:1166::-;;2419:2;2462;2450:9;2441:7;2437:23;2433:32;2430:2;;;2483:6;2475;2468:22;2430:2;2528:9;2515:23;2557:18;2598:2;2590:6;2587:14;2584:2;;;2619:6;2611;2604:22;2584:2;2662:6;2651:9;2647:22;2637:32;;2707:7;2700:4;2696:2;2692:13;2688:27;2678:2;;2734:6;2726;2719:22;2678:2;2775;2762:16;2797:2;2793;2790:10;2787:2;;;2803:18;;:::i;:::-;2850:2;2846;2842:11;2882:2;2876:9;2933:2;2928;2920:6;2916:15;2912:24;2986:6;2974:10;2971:22;2966:2;2954:10;2951:18;2948:46;2945:2;;;2997:18;;:::i;:::-;3033:2;3026:22;3083:18;;;3117:15;;;;-1:-1:-1;3152:11:11;;;3182;;;3178:20;;3175:33;-1:-1:-1;3172:2:11;;;3226:6;3218;3211:22;3172:2;3253:6;3244:15;;3268:171;3282:2;3279:1;3276:9;3268:171;;;3339:25;3360:3;3339:25;:::i;:::-;3327:38;;3300:1;3293:9;;;;;3385:12;;;;3417;;3268:171;;;-1:-1:-1;3458:6:11;2399:1071;-1:-1:-1;;;;;;;;2399:1071:11:o;3475:257::-;;3595:2;3583:9;3574:7;3570:23;3566:32;3563:2;;;3616:6;3608;3601:22;3563:2;3653:9;3647:16;3672:30;3696:5;3672:30;:::i;3737:190::-;;3849:2;3837:9;3828:7;3824:23;3820:32;3817:2;;;3870:6;3862;3855:22;3817:2;-1:-1:-1;3898:23:11;;3807:120;-1:-1:-1;3807:120:11:o;3932:194::-;;4055:2;4043:9;4034:7;4030:23;4026:32;4023:2;;;4076:6;4068;4061:22;4023:2;-1:-1:-1;4104:16:11;;4013:113;-1:-1:-1;4013:113:11:o;4131:326::-;;;;4277:2;4265:9;4256:7;4252:23;4248:32;4245:2;;;4298:6;4290;4283:22;4245:2;-1:-1:-1;;4326:23:11;;;4396:2;4381:18;;4368:32;;-1:-1:-1;4447:2:11;4432:18;;;4419:32;;4235:222;-1:-1:-1;4235:222:11:o;4462:203::-;-1:-1:-1;;;;;4626:32:11;;;;4608:51;;4596:2;4581:18;;4563:102::o;4670:282::-;-1:-1:-1;;;;;4870:32:11;;;;4852:51;;4934:2;4919:18;;4912:34;4840:2;4825:18;;4807:145::o;4957:187::-;5122:14;;5115:22;5097:41;;5085:2;5070:18;;5052:92::o;5149:603::-;;5290:2;5319;5308:9;5301:21;5351:6;5345:13;5394:6;5389:2;5378:9;5374:18;5367:34;5419:4;5432:140;5446:6;5443:1;5440:13;5432:140;;;5541:14;;;5537:23;;5531:30;5507:17;;;5526:2;5503:26;5496:66;5461:10;;5432:140;;;5590:6;5587:1;5584:13;5581:2;;;5660:4;5655:2;5646:6;5635:9;5631:22;5627:31;5620:45;5581:2;-1:-1:-1;5736:2:11;5715:15;-1:-1:-1;;5711:29:11;5696:45;;;;5743:2;5692:54;;5270:482;-1:-1:-1;;;5270:482:11:o;5757:399::-;5959:2;5941:21;;;5998:2;5978:18;;;5971:30;6037:34;6032:2;6017:18;;6010:62;-1:-1:-1;;;6103:2:11;6088:18;;6081:33;6146:3;6131:19;;5931:225::o;6161:353::-;6363:2;6345:21;;;6402:2;6382:18;;;6375:30;6441:31;6436:2;6421:18;;6414:59;6505:2;6490:18;;6335:179::o;6519:398::-;6721:2;6703:21;;;6760:2;6740:18;;;6733:30;6799:34;6794:2;6779:18;;6772:62;-1:-1:-1;;;6865:2:11;6850:18;;6843:32;6907:3;6892:19;;6693:224::o;6922:346::-;7124:2;7106:21;;;7163:2;7143:18;;;7136:30;-1:-1:-1;;;7197:2:11;7182:18;;7175:52;7259:2;7244:18;;7096:172::o;7273:402::-;7475:2;7457:21;;;7514:2;7494:18;;;7487:30;7553:34;7548:2;7533:18;;7526:62;-1:-1:-1;;;7619:2:11;7604:18;;7597:36;7665:3;7650:19;;7447:228::o;7680:398::-;7882:2;7864:21;;;7921:2;7901:18;;;7894:30;7960:34;7955:2;7940:18;;7933:62;-1:-1:-1;;;8026:2:11;8011:18;;8004:32;8068:3;8053:19;;7854:224::o;8083:400::-;8285:2;8267:21;;;8324:2;8304:18;;;8297:30;8363:34;8358:2;8343:18;;8336:62;-1:-1:-1;;;8429:2:11;8414:18;;8407:34;8473:3;8458:19;;8257:226::o;8488:421::-;8690:2;8672:21;;;8729:2;8709:18;;;8702:30;8768:34;8763:2;8748:18;;8741:62;8839:27;8834:2;8819:18;;8812:55;8899:3;8884:19;;8662:247::o;8914:353::-;9116:2;9098:21;;;9155:2;9135:18;;;9128:30;9194:31;9189:2;9174:18;;9167:59;9258:2;9243:18;;9088:179::o;9272:402::-;9474:2;9456:21;;;9513:2;9493:18;;;9486:30;9552:34;9547:2;9532:18;;9525:62;-1:-1:-1;;;9618:2:11;9603:18;;9596:36;9664:3;9649:19;;9446:228::o;9679:418::-;9881:2;9863:21;;;9920:2;9900:18;;;9893:30;9959:34;9954:2;9939:18;;9932:62;-1:-1:-1;;;10025:2:11;10010:18;;10003:52;10087:3;10072:19;;9853:244::o;10102:417::-;10304:2;10286:21;;;10343:2;10323:18;;;10316:30;10382:34;10377:2;10362:18;;10355:62;-1:-1:-1;;;10448:2:11;10433:18;;10426:51;10509:3;10494:19;;10276:243::o;10524:416::-;10726:2;10708:21;;;10765:2;10745:18;;;10738:30;10804:34;10799:2;10784:18;;10777:62;-1:-1:-1;;;10870:2:11;10855:18;;10848:50;10930:3;10915:19;;10698:242::o;10945:417::-;11147:2;11129:21;;;11186:2;11166:18;;;11159:30;11225:34;11220:2;11205:18;;11198:62;-1:-1:-1;;;11291:2:11;11276:18;;11269:51;11352:3;11337:19;;11119:243::o;11367:477::-;11569:2;11551:21;;;11608:2;11588:18;;;11581:30;11647:34;11642:2;11627:18;;11620:62;11718:34;11713:2;11698:18;;11691:62;-1:-1:-1;;;11784:3:11;11769:19;;11762:40;11834:3;11819:19;;11541:303::o;11849:356::-;12051:2;12033:21;;;12070:18;;;12063:30;12129:34;12124:2;12109:18;;12102:62;12196:2;12181:18;;12023:182::o;12210:397::-;12412:2;12394:21;;;12451:2;12431:18;;;12424:30;12490:34;12485:2;12470:18;;12463:62;-1:-1:-1;;;12556:2:11;12541:18;;12534:31;12597:3;12582:19;;12384:223::o;12612:401::-;12814:2;12796:21;;;12853:2;12833:18;;;12826:30;12892:34;12887:2;12872:18;;12865:62;-1:-1:-1;;;12958:2:11;12943:18;;12936:35;13003:3;12988:19;;12786:227::o;13018:481::-;13220:2;13202:21;;;13259:2;13239:18;;;13232:30;13298:34;13293:2;13278:18;;13271:62;13369:34;13364:2;13349:18;;13342:62;-1:-1:-1;;;13435:3:11;13420:19;;13413:44;13489:3;13474:19;;13192:307::o;13504:400::-;13706:2;13688:21;;;13745:2;13725:18;;;13718:30;13784:34;13779:2;13764:18;;13757:62;-1:-1:-1;;;13850:2:11;13835:18;;13828:34;13894:3;13879:19;;13678:226::o;13909:343::-;14111:2;14093:21;;;14150:2;14130:18;;;14123:30;-1:-1:-1;;;14184:2:11;14169:18;;14162:49;14243:2;14228:18;;14083:169::o;14257:401::-;14459:2;14441:21;;;14498:2;14478:18;;;14471:30;14537:34;14532:2;14517:18;;14510:62;-1:-1:-1;;;14603:2:11;14588:18;;14581:35;14648:3;14633:19;;14431:227::o;14663:411::-;14865:2;14847:21;;;14904:2;14884:18;;;14877:30;14943:34;14938:2;14923:18;;14916:62;-1:-1:-1;;;15009:2:11;14994:18;;14987:45;15064:3;15049:19;;14837:237::o;15079:177::-;15225:25;;;15213:2;15198:18;;15180:76::o;15261:983::-;;15571:3;15560:9;15556:19;15602:6;15591:9;15584:25;15628:2;15666:6;15661:2;15650:9;15646:18;15639:34;15709:3;15704:2;15693:9;15689:18;15682:31;15733:6;15768;15762:13;15799:6;15791;15784:22;15837:3;15826:9;15822:19;15815:26;;15876:2;15868:6;15864:15;15850:29;;15897:4;15910:195;15924:6;15921:1;15918:13;15910:195;;;15989:13;;-1:-1:-1;;;;;15985:39:11;15973:52;;16080:15;;;;16045:12;;;;16021:1;15939:9;15910:195;;;-1:-1:-1;;;;;;;16161:32:11;;;;16156:2;16141:18;;16134:60;-1:-1:-1;;;16225:3:11;16210:19;16203:35;16122:3;15532:712;-1:-1:-1;;;15532:712:11:o;16249:184::-;16421:4;16409:17;;;;16391:36;;16379:2;16364:18;;16346:87::o;16438:128::-;;16509:1;16505:6;16502:1;16499:13;16496:2;;;16515:18;;:::i;:::-;-1:-1:-1;16551:9:11;;16486:80::o;16571:217::-;;16637:1;16627:2;;-1:-1:-1;;;16662:31:11;;16716:4;16713:1;16706:15;16744:4;16669:1;16734:15;16627:2;-1:-1:-1;16773:9:11;;16617:171::o;16793:168::-;;16899:1;16895;16891:6;16887:14;16884:1;16881:21;16876:1;16869:9;16862:17;16858:45;16855:2;;;16906:18;;:::i;:::-;-1:-1:-1;16946:9:11;;16845:116::o;16966:125::-;;17034:1;17031;17028:8;17025:2;;;17039:18;;:::i;:::-;-1:-1:-1;17076:9:11;;17015:76::o;17096:380::-;17181:1;17171:12;;17228:1;17218:12;;;17239:2;;17293:4;17285:6;17281:17;17271:27;;17239:2;17346;17338:6;17335:14;17315:18;17312:38;17309:2;;;17392:10;17387:3;17383:20;17380:1;17373:31;17427:4;17424:1;17417:15;17455:4;17452:1;17445:15;17309:2;;17151:325;;;:::o;17481:135::-;;-1:-1:-1;;17541:17:11;;17538:2;;;17561:18;;:::i;:::-;-1:-1:-1;17608:1:11;17597:13;;17528:88::o;17621:127::-;17682:10;17677:3;17673:20;17670:1;17663:31;17713:4;17710:1;17703:15;17737:4;17734:1;17727:15;17753:127;17814:10;17809:3;17805:20;17802:1;17795:31;17845:4;17842:1;17835:15;17869:4;17866:1;17859:15;17885:133;-1:-1:-1;;;;;17962:31:11;;17952:42;;17942:2;;18008:1;18005;17998:12;18023:120;18111:5;18104:13;18097:21;18090:5;18087:32;18077:2;;18133:1;18130;18123:12
Swarm Source
ipfs://5b2923fce292c1dee3aa8eebfa783cadf4e4130fb0793b00f281f23f65b66e98
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.