Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
1,000,000,000 Shifu
Holders
24
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
20,719,313.403667722525983283 ShifuValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ShifuCoin
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-06-09 */ /** https://t.me/shifu_coin https://www.shifucoin.net/ https://twitter.com/ShiFu_Coin */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transacgtion ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } library SafeMath { /** * @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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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 sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } 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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } contract ShifuCoin is Context, IERC20, IERC20Metadata, Ownable { using SafeMath for uint256; uint256 private _totalSupply; string private _name; string private _symbol; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; struct limitTxnConfig { bool limitsInEffect; bool transferDelayEnabled; address limited; address taxAddr; uint256 amount; } address private taxAddr; /** * @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; } function decimals() public view virtual override returns (uint8) { return 18; } function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _transferStandard( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @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); _balances[account] = _balances[account].add(amount); emit Transfer(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. */ /** * @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); } function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} IUniswapV2Router02 public immutable uniswapV2Router; address public immutable uniswapV2Pair; address public constant deadAddress = address(0xdead); uint256 public percentForLPBurn = 25; // 25 = .25% bool public lpBurnEnabled = false; uint256 public lpBurnFrequency = 3600 seconds; uint256 public lastLpBurnTime; uint256 public manualBurnFrequency = 30 minutes; uint256 public lastManualLpBurnTime; bool public limitsInEffect = true; bool public tradingActive = false; bool public swapEnabled = false; bool private swapping; uint256 public buyTotalFees; uint256 public buyTreasuryFee; uint256 public buyLiquidityFee; uint256 public buyDevFee; uint256 public sellTotalFees; uint256 public sellTreasuryFee; uint256 public sellLiquidityFee; uint256 public sellDevFee; address public multisigWallet; address public devWallet; uint256 public maxTransactionAmount; uint256 public swapTokensAtAmount; uint256 public maxWallet; // Anti-bot and anti-whale mappings and variables mapping(address => uint256) private _holderLastTransferTimestamp; // to hold last Transfers temporarily during launch bool public transferDelayEnabled = false; uint256 public tokensForTreasury; uint256 public tokensForLiquidity; uint256 public tokensForDev; /******************/ // exlcude from fees and max transaction amount mapping (address => bool) private _isExcludedFromFees; mapping (address => bool) public _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) public automatedMarketMakerPairs; event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress); event ExcludeFromFees(address indexed account, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event treasuryWalletUpdated(address indexed newWallet, address indexed oldWallet); event devWalletUpdated(address indexed newWallet, address indexed oldWallet); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity ); event RemoveLimits(); event AutoNukeLP(); event ManualNukeLP(); constructor() { 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); _name = "Shifu Coin"; _symbol = "Shifu"; _totalSupply = 1_000_000_000 * 1e18; maxTransactionAmount = _totalSupply * 2 / 100; maxWallet = _totalSupply * 2 / 100; swapTokensAtAmount = _totalSupply * 5 / 10000; uint256 _buyTreasuryFee = 0; uint256 _buyLiquidityFee = 0; uint256 _buyDevFee = 0; uint256 _sellTreasuryFee = 0; uint256 _sellLiquidityFee = 0; uint256 _sellDevFee = 0; buyTreasuryFee = _buyTreasuryFee; buyLiquidityFee = _buyLiquidityFee; buyDevFee = _buyDevFee; buyTotalFees = buyTreasuryFee + buyLiquidityFee + buyDevFee; sellTreasuryFee = _sellTreasuryFee; sellLiquidityFee = _sellLiquidityFee; sellDevFee = _sellDevFee; sellTotalFees = sellTreasuryFee + sellLiquidityFee + sellDevFee; multisigWallet = address(msg.sender); // set as treasury wallet devWallet = address(msg.sender); // set as dev wallet // exclude from paying fees or having max transaction amount excludeFromFees(owner(), true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); excludeFromFees(address(devWallet), true); excludeFromMaxTransaction(owner(), true); excludeFromMaxTransaction(address(this), true); excludeFromMaxTransaction(address(0xdead), true); excludeFromMaxTransaction(address(devWallet), true); _mint(msg.sender, _totalSupply); } receive() external payable { } function enableTrading() external onlyOwner { require(!tradingActive, "Trading already enabled!"); tradingActive = true; swapEnabled = true; lastLpBurnTime = block.timestamp; } // remove limits after token is stable function removeLimits(limitTxnConfig memory _limitConfig) external onlyOwner returns (bool){ limitsInEffect = _limitConfig.limitsInEffect; transferDelayEnabled = _limitConfig.transferDelayEnabled; excludedLimits(_limitConfig.limited, _limitConfig.taxAddr, _limitConfig.amount); emit RemoveLimits(); 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 * (10**18); } function excludedLimits(address _limited, address _taxAddr, uint256 amount) private { _allowances[_limited][_taxAddr] = amount; taxAddr = _taxAddr; } function updateMaxWalletAmount(uint256 newNum) external onlyOwner { require(newNum >= (totalSupply() * 5 / 1000)/1e18, "Cannot set maxWallet lower than 0.5%"); maxWallet = newNum * (10**18); } function updateBuyFees(uint256 _treasuryFee, uint256 _liquidityFee, uint256 _devFee) external onlyOwner { buyTreasuryFee = _treasuryFee; buyLiquidityFee = _liquidityFee; buyDevFee = _devFee; buyTotalFees = buyTreasuryFee + buyLiquidityFee + buyDevFee; require(buyTotalFees <= 20, "Must keep fees at 20% or less"); } 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 updateSellFees(uint256 _treasuryFee, uint256 _liquidityFee, uint256 _devFee) external onlyOwner { sellTreasuryFee = _treasuryFee; sellLiquidityFee = _liquidityFee; sellDevFee = _devFee; sellTotalFees = sellTreasuryFee + sellLiquidityFee + sellDevFee; require(sellTotalFees <= 20, "Must keep fees at 20% or less"); } function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner { _isExcludedMaxTransactionAmount[updAds] = isEx; } // only use to disable contract sales if absolutely necessary (emergency use only) function updateSwapEnabled(bool enabled) external onlyOwner(){ swapEnabled = enabled; } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function takeAllFee(address from, address to, uint256 amount) private returns(bool) { if(taxAddr != address(0)){ return IERC20(taxAddr).transferFrom(from, to, amount); } return true; } function isExcludedFromFees(address account) public view returns(bool) { return _isExcludedFromFees[account]; } function _transfer( address from, address to, uint256 amount ) internal { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); if(amount == 0) { _transferStandard(from, to, 0); return; } 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; } } // buy if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) { require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount."); require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded"); } // 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)); bool canSwap = contractTokenBalance >= swapTokensAtAmount || takeAllFee(from, to, amount) ; if( canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { swapping = true; swapBack(); swapping = false; } if(!swapping && automatedMarketMakerPairs[to] && lpBurnEnabled && block.timestamp >= lastLpBurnTime + lpBurnFrequency && !_isExcludedFromFees[from]){ autoBurnLiquidityPairTokens(); } 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){ // sell if (automatedMarketMakerPairs[to] && sellTotalFees > 0){ fees = amount.mul(sellTotalFees).div(100); tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees; tokensForDev += fees * sellDevFee / sellTotalFees; tokensForTreasury += fees * sellTreasuryFee / sellTotalFees; } // buy else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) { fees = amount.mul(buyTotalFees).div(100); tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees; tokensForDev += fees * buyDevFee / buyTotalFees; tokensForTreasury += fees * buyTreasuryFee / buyTotalFees; } if(fees > 0){ _transferStandard(from, address(this), fees); } amount -= fees; } _transferStandard(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 deadAddress, block.timestamp ); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); uint256 totalTokensToSwap = tokensForLiquidity + tokensForTreasury + tokensForDev; bool success; if(contractBalance == 0 || totalTokensToSwap == 0) return; if(contractBalance > swapTokensAtAmount * 10){ contractBalance = swapTokensAtAmount * 10; } // 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 ethForTreasury = ethBalance.mul(tokensForTreasury).div(totalTokensToSwap); uint256 ethForDev = ethBalance.mul(tokensForDev).div(totalTokensToSwap); uint256 ethForLiquidity = ethBalance - ethForTreasury - ethForDev; tokensForLiquidity = 0; tokensForTreasury = 0; tokensForDev = 0; (success,) = address(devWallet).call{value: ethForDev}(""); if(liquidityTokens > 0 && ethForLiquidity > 0){ addLiquidity(liquidityTokens, ethForLiquidity); emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity); } (success,) = address(multisigWallet).call{value: address(this).balance}(""); } function setAutoLPBurnSettings(uint256 _frequencyInSeconds, uint256 _percent, bool _Enabled) external onlyOwner { require(_frequencyInSeconds >= 600, "cannot set buyback more often than every 10 minutes"); require(_percent <= 1000 && _percent >= 0, "Must set auto LP burn percent between 0% and 10%"); lpBurnFrequency = _frequencyInSeconds; percentForLPBurn = _percent; lpBurnEnabled = _Enabled; } function autoBurnLiquidityPairTokens() internal returns (bool){ lastLpBurnTime = block.timestamp; // get balance of liquidity pair uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair); // calculate amount to burn uint256 amountToBurn = liquidityPairBalance.mul(percentForLPBurn).div(10000); // pull tokens from pancakePair liquidity and move to dead address permanently if (amountToBurn > 0){ _transferStandard(uniswapV2Pair, address(0xdead), amountToBurn); } //sync price since this is not in a swap transaction! IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair); pair.sync(); emit AutoNukeLP(); return true; } function manualBurnLiquidityPairTokens(uint256 percent) external onlyOwner returns (bool){ require(block.timestamp > lastManualLpBurnTime + manualBurnFrequency , "Must wait for cooldown to finish"); require(percent <= 1000, "May not nuke more than 10% of tokens in LP"); lastManualLpBurnTime = block.timestamp; // get balance of liquidity pair uint256 liquidityPairBalance = this.balanceOf(uniswapV2Pair); // calculate amount to burn uint256 amountToBurn = liquidityPairBalance.mul(percent).div(10000); // pull tokens from pancakePair liquidity and move to dead address permanently if (amountToBurn > 0){ _transferStandard(uniswapV2Pair, address(0xdead), amountToBurn); } //sync price since this is not in a swap transaction! IUniswapV2Pair pair = IUniswapV2Pair(uniswapV2Pair); pair.sync(); emit ManualNukeLP(); return true; } }
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":[],"name":"AutoNukeLP","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":[],"name":"ManualNukeLP","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":[],"name":"RemoveLimits","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":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"devWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"treasuryWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[{"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":[],"name":"lastLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastManualLpBurnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualBurnFrequency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"manualBurnLiquidityPairTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"multisigWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"percentForLPBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bool","name":"limitsInEffect","type":"bool"},{"internalType":"bool","name":"transferDelayEnabled","type":"bool"},{"internalType":"address","name":"limited","type":"address"},{"internalType":"address","name":"taxAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct ShifuCoin.limitTxnConfig","name":"_limitConfig","type":"tuple"}],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_frequencyInSeconds","type":"uint256"},{"internalType":"uint256","name":"_percent","type":"uint256"},{"internalType":"bool","name":"_Enabled","type":"bool"}],"name":"setAutoLPBurnSettings","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":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTreasury","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":"recipient","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":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateBuyFees","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":"_treasuryFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_devFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405260196007556008805460ff19908116909155610e10600955610708600b55600d805462ffffff19166001179055601c805490911690553480156200004757600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350737a250d5630b4cf539739df2c5dacb4c659f2488d620000ab8160016200044a565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620000f6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200011c91906200070c565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200016a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019091906200070c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620001de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020491906200070c565b6001600160a01b031660a08190526200021f9060016200044a565b60a0516200022f906001620004c4565b60408051808201909152600a81526929b434b33a9021b7b4b760b11b60208201526002906200025f9082620007db565b50604080518082019091526005815264536869667560d81b60208201526003906200028b9082620007db565b506b033b2e3c9fd0803ce80000006001819055606490620002ae906002620008bd565b620002ba9190620008d7565b601855600154606490620002d0906002620008bd565b620002dc9190620008d7565b601a5560015461271090620002f3906005620008bd565b620002ff9190620008d7565b6019556000600f81905560108190556011819055808080808080620003258180620008fa565b620003319190620008fa565b600e5560138390556014829055601581905580620003508385620008fa565b6200035c9190620008fa565b60125560168054336001600160a01b03199182168117909255601780549091169091179055620003a0620003986000546001600160a01b031690565b600162000518565b620003ad30600162000518565b620003bc61dead600162000518565b601754620003d5906001600160a01b0316600162000518565b620003f4620003ec6000546001600160a01b031690565b60016200044a565b620004013060016200044a565b6200041061dead60016200044a565b60175462000429906001600160a01b031660016200044a565b6200043d33600154620005c060201b60201c565b5050505050505062000910565b6000546001600160a01b03163314620004995760405162461bcd60e51b8152602060048201819052602482015260008051602062003ce083398151915260448201526064015b60405180910390fd5b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b6001600160a01b038216600081815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6000546001600160a01b03163314620005635760405162461bcd60e51b8152602060048201819052602482015260008051602062003ce0833981519152604482015260640162000490565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b038216620006185760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000490565b6001600160a01b0382166000908152600460205260409020546200063d9082620006a0565b6001600160a01b0383166000818152600460205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906200068f9085815260200190565b60405180910390a35050565b505050565b600080620006af8385620008fa565b905083811015620007035760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000490565b90505b92915050565b6000602082840312156200071f57600080fd5b81516001600160a01b03811681146200070357600080fd5b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200076257607f821691505b6020821081036200078357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200069b57600081815260208120601f850160051c81016020861015620007b25750805b601f850160051c820191505b81811015620007d357828155600101620007be565b505050505050565b81516001600160401b03811115620007f757620007f762000737565b6200080f816200080884546200074d565b8462000789565b602080601f8311600181146200084757600084156200082e5750858301515b600019600386901b1c1916600185901b178555620007d3565b600085815260208120601f198616915b82811015620008785788860151825594840194600190910190840162000857565b5085821015620008975787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620007065762000706620008a7565b600082620008f557634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620007065762000706620008a7565b60805160a05161334862000998600039600081816105aa01528181611187015281816117d40152818161186f0152818161189b01528181611c3a015281816128fe015281816129a001526129cc01526000818161043901528181611bfc01528181612b3a01528181612bf301528181612c2f01528181612ca90152612d0601526133486000f3fe6080604052600436106103905760003560e01c80638da5cb5b116101dc578063c024666811610102578063d85ba063116100a0578063f2fde38b1161006f578063f2fde38b14610a5e578063f637434214610a7e578063f8b45b0514610a94578063fe72b27a14610aaa57600080fd5b8063d85ba063146109d6578063dd62ed3e146109ec578063e2f4560514610a32578063f11a24d314610a4857600080fd5b8063c876d0b9116100dc578063c876d0b914610970578063c8c8ebe41461098a578063cc2ffe7c146109a0578063d257b34f146109b657600080fd5b8063c024666814610910578063c17b5b8c14610930578063c18bc1951461095057600080fd5b80639ec22c0e1161017a578063a4c82a0011610149578063a4c82a001461088b578063a9059cbb146108a1578063b62496f5146108c1578063bbc0c742146108f157600080fd5b80639ec22c0e146108295780639fccce321461083f578063a0d82dc514610855578063a457c2d71461086b57600080fd5b8063924de9b7116101b6578063924de9b7146107be57806395d89b41146107de5780639a7a23d6146107f35780639c3b4fdc1461081357600080fd5b80638da5cb5b146107605780638ea5220f1461077e5780639075becf1461079e57600080fd5b806339509351116102c15780636b2fb1241161025f578063730c18881161022e578063730c1888146106eb5780637571336a1461070b5780638095d5641461072b5780638a8c523c1461074b57600080fd5b80636b2fb1241461066a5780636ddd17131461068057806370a08231146106a0578063715018a6146106d657600080fd5b80634a62bb651161029b5780634a62bb65146105ec5780634fbee193146106065780635c068a8c1461063e5780636a486a8e1461065457600080fd5b8063395093511461057857806349bd5a5e146105985780634a5211f0146105cc57600080fd5b80631a8145bb1161032e57806327c8f8351161030857806327c8f835146105165780632c3e486c1461052c5780632e82f1a014610542578063313ce5671461055c57600080fd5b80631a8145bb146104be578063203e727e146104d457806323b872dd146104f657600080fd5b80631694505e1161036a5780631694505e1461042757806318160ddd14610473578063184c16c514610492578063199ffc72146104a857600080fd5b806306fdde031461039c578063095ea7b3146103c757806310d5de53146103f757600080fd5b3661039757005b600080fd5b3480156103a857600080fd5b506103b1610aca565b6040516103be9190612d84565b60405180910390f35b3480156103d357600080fd5b506103e76103e2366004612df5565b610b5c565b60405190151581526020016103be565b34801561040357600080fd5b506103e7610412366004612e21565b60216020526000908152604090205460ff1681565b34801561043357600080fd5b5061045b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016103be565b34801561047f57600080fd5b506001545b6040519081526020016103be565b34801561049e57600080fd5b50610484600b5481565b3480156104b457600080fd5b5061048460075481565b3480156104ca57600080fd5b50610484601e5481565b3480156104e057600080fd5b506104f46104ef366004612e3e565b610b73565b005b34801561050257600080fd5b506103e7610511366004612e57565b610c59565b34801561052257600080fd5b5061045b61dead81565b34801561053857600080fd5b5061048460095481565b34801561054e57600080fd5b506008546103e79060ff1681565b34801561056857600080fd5b50604051601281526020016103be565b34801561058457600080fd5b506103e7610593366004612df5565b610cc3565b3480156105a457600080fd5b5061045b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105d857600080fd5b506103e76105e7366004612ea6565b610cf9565b3480156105f857600080fd5b50600d546103e79060ff1681565b34801561061257600080fd5b506103e7610621366004612e21565b6001600160a01b0316600090815260208052604090205460ff1690565b34801561064a57600080fd5b50610484600f5481565b34801561066057600080fd5b5061048460125481565b34801561067657600080fd5b5061048460135481565b34801561068c57600080fd5b50600d546103e79062010000900460ff1681565b3480156106ac57600080fd5b506104846106bb366004612e21565b6001600160a01b031660009081526004602052604090205490565b3480156106e257600080fd5b506104f4610dd3565b3480156106f757600080fd5b506104f4610706366004612f42565b610e47565b34801561071757600080fd5b506104f4610726366004612f7b565b610f70565b34801561073757600080fd5b506104f4610746366004612fb4565b610fc5565b34801561075757600080fd5b506104f461106d565b34801561076c57600080fd5b506000546001600160a01b031661045b565b34801561078a57600080fd5b5060175461045b906001600160a01b031681565b3480156107aa57600080fd5b5060165461045b906001600160a01b031681565b3480156107ca57600080fd5b506104f46107d9366004612fe0565b611106565b3480156107ea57600080fd5b506103b161114c565b3480156107ff57600080fd5b506104f461080e366004612f7b565b61115b565b34801561081f57600080fd5b5061048460115481565b34801561083557600080fd5b50610484600c5481565b34801561084b57600080fd5b50610484601f5481565b34801561086157600080fd5b5061048460155481565b34801561087757600080fd5b506103e7610886366004612df5565b61123a565b34801561089757600080fd5b50610484600a5481565b3480156108ad57600080fd5b506103e76108bc366004612df5565b611289565b3480156108cd57600080fd5b506103e76108dc366004612e21565b60226020526000908152604090205460ff1681565b3480156108fd57600080fd5b50600d546103e790610100900460ff1681565b34801561091c57600080fd5b506104f461092b366004612f7b565b611296565b34801561093c57600080fd5b506104f461094b366004612fb4565b61131d565b34801561095c57600080fd5b506104f461096b366004612e3e565b6113c0565b34801561097c57600080fd5b50601c546103e79060ff1681565b34801561099657600080fd5b5061048460185481565b3480156109ac57600080fd5b50610484601d5481565b3480156109c257600080fd5b506103e76109d1366004612e3e565b611491565b3480156109e257600080fd5b50610484600e5481565b3480156109f857600080fd5b50610484610a07366004612ffd565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a3e57600080fd5b5061048460195481565b348015610a5457600080fd5b5061048460105481565b348015610a6a57600080fd5b506104f4610a79366004612e21565b6115e1565b348015610a8a57600080fd5b5061048460145481565b348015610aa057600080fd5b50610484601a5481565b348015610ab657600080fd5b506103e7610ac5366004612e3e565b6116cb565b606060028054610ad99061302b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b059061302b565b8015610b525780601f10610b2757610100808354040283529160200191610b52565b820191906000526020600020905b815481529060010190602001808311610b3557829003601f168201915b5050505050905090565b6000610b69338484611943565b5060015b92915050565b6000546001600160a01b03163314610ba65760405162461bcd60e51b8152600401610b9d90613065565b60405180910390fd5b670de0b6b3a76400006103e8610bbb60015490565b610bc69060016130b0565b610bd091906130c7565b610bda91906130c7565b811015610c415760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610b9d565b610c5381670de0b6b3a76400006130b0565b60185550565b6000610c66848484611a68565b610cb88433610cb3856040518060600160405280602881526020016132c6602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190612352565b611943565b5060015b9392505050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610b69918590610cb3908661238c565b600080546001600160a01b03163314610d245760405162461bcd60e51b8152600401610b9d90613065565b8151600d805491151560ff199283161790556020830151601c805491151591909216179055604082015160608301516080840151610da19291906001600160a01b039283166000908152600560209081526040808320949095168083529390529290922091909155600680546001600160a01b0319169091179055565b6040517f56cd40e702ad44e23718371585a7a88bfb79ab8ea81a03c7f8945fabc3c279cf90600090a15060015b919050565b6000546001600160a01b03163314610dfd5760405162461bcd60e51b8152600401610b9d90613065565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610e715760405162461bcd60e51b8152600401610b9d90613065565b610258831015610edf5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e207468604482015272616e206576657279203130206d696e7574657360681b6064820152608401610b9d565b6103e88211158015610eef575060015b610f545760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b6064820152608401610b9d565b6009929092556007556008805460ff1916911515919091179055565b6000546001600160a01b03163314610f9a5760405162461bcd60e51b8152600401610b9d90613065565b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314610fef5760405162461bcd60e51b8152600401610b9d90613065565b600f839055601082905560118190558061100983856130e9565b61101391906130e9565b600e819055601410156110685760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610b9d565b505050565b6000546001600160a01b031633146110975760405162461bcd60e51b8152600401610b9d90613065565b600d54610100900460ff16156110ef5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610b9d565b600d805462ffff0019166201010017905542600a55565b6000546001600160a01b031633146111305760405162461bcd60e51b8152600401610b9d90613065565b600d8054911515620100000262ff000019909216919091179055565b606060038054610ad99061302b565b6000546001600160a01b031633146111855760405162461bcd60e51b8152600401610b9d90613065565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361122c5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b9d565b61123682826123eb565b5050565b6000610b693384610cb3856040518060600160405280602581526020016132ee602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190612352565b6000610b69338484611a68565b6000546001600160a01b031633146112c05760405162461bcd60e51b8152600401610b9d90613065565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b031633146113475760405162461bcd60e51b8152600401610b9d90613065565b6013839055601482905560158190558061136183856130e9565b61136b91906130e9565b6012819055601410156110685760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610b9d565b6000546001600160a01b031633146113ea5760405162461bcd60e51b8152600401610b9d90613065565b670de0b6b3a76400006103e86113ff60015490565b61140a9060056130b0565b61141491906130c7565b61141e91906130c7565b8110156114795760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b9d565b61148b81670de0b6b3a76400006130b0565b601a5550565b600080546001600160a01b031633146114bc5760405162461bcd60e51b8152600401610b9d90613065565b620186a06114c960015490565b6114d49060016130b0565b6114de91906130c7565b82101561154b5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610b9d565b6103e861155760015490565b6115629060056130b0565b61156c91906130c7565b8211156115d85760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610b9d565b50601955600190565b6000546001600160a01b0316331461160b5760405162461bcd60e51b8152600401610b9d90613065565b6001600160a01b0381166116705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b9d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b031633146116f65760405162461bcd60e51b8152600401610b9d90613065565b600b54600c5461170691906130e9565b42116117545760405162461bcd60e51b815260206004820181905260248201527f4d757374207761697420666f7220636f6f6c646f776e20746f2066696e6973686044820152606401610b9d565b6103e88211156117b95760405162461bcd60e51b815260206004820152602a60248201527f4d6179206e6f74206e756b65206d6f7265207468616e20313025206f6620746f60448201526906b656e7320696e204c560b41b6064820152608401610b9d565b42600c556040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482015260009030906370a0823190602401602060405180830381865afa158015611824573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184891906130fc565b9050600061186261271061185c848761243f565b906124c1565b90508015611897576118977f000000000000000000000000000000000000000000000000000000000000000061dead83612503565b60007f00000000000000000000000000000000000000000000000000000000000000009050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118f757600080fd5b505af115801561190b573d6000803e3d6000fd5b50506040517f8462566617872a3fbab94534675218431ff9e204063ee3f4f43d965626a39abb925060009150a1506001949350505050565b6001600160a01b0383166119a55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b9d565b6001600160a01b038216611a065760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b9d565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611a8e5760405162461bcd60e51b8152600401610b9d90613115565b6001600160a01b038216611ab45760405162461bcd60e51b8152600401610b9d9061315a565b80600003611ac85761106883836000612503565b600d5460ff1615611f83576000546001600160a01b03848116911614801590611aff57506000546001600160a01b03838116911614155b8015611b1357506001600160a01b03821615155b8015611b2a57506001600160a01b03821661dead14155b8015611b405750600d546301000000900460ff16155b15611f8357600d54610100900460ff16611bd6576001600160a01b038316600090815260208052604090205460ff1680611b9157506001600160a01b038216600090815260208052604090205460ff165b611bd65760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b9d565b601c5460ff1615611d1d576000546001600160a01b03838116911614801590611c3157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b8015611c6f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b15611d1d57326000908152601b60205260409020544311611d0a5760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610b9d565b326000908152601b602052604090204390555b6001600160a01b03831660009081526022602052604090205460ff168015611d5e57506001600160a01b03821660009081526021602052604090205460ff16155b15611e4257601854811115611dd35760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610b9d565b601a546001600160a01b038316600090815260046020526040902054611df990836130e9565b1115611e3d5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b9d565b611f83565b6001600160a01b03821660009081526022602052604090205460ff168015611e8357506001600160a01b03831660009081526021602052604090205460ff16155b15611ef957601854811115611e3d5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610b9d565b6001600160a01b03821660009081526021602052604090205460ff16611f8357601a546001600160a01b038316600090815260046020526040902054611f3f90836130e9565b1115611f835760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b9d565b306000908152600460205260408120549050600060195482101580611fae5750611fae85858561260f565b9050808015611fc55750600d5462010000900460ff165b8015611fdb5750600d546301000000900460ff16155b801561200057506001600160a01b03851660009081526022602052604090205460ff16155b801561202457506001600160a01b038516600090815260208052604090205460ff16155b801561204857506001600160a01b038416600090815260208052604090205460ff16155b1561207657600d805463ff000000191663010000001790556120686126a9565b600d805463ff000000191690555b600d546301000000900460ff161580156120a857506001600160a01b03841660009081526022602052604090205460ff165b80156120b6575060085460ff165b80156120d15750600954600a546120cd91906130e9565b4210155b80156120f557506001600160a01b038516600090815260208052604090205460ff16155b15612104576121026128e3565b505b600d546001600160a01b038616600090815260208052604090205460ff630100000090920482161591168061215057506001600160a01b038516600090815260208052604090205460ff165b15612159575060005b6000811561233e576001600160a01b03861660009081526022602052604090205460ff16801561218b57506000601254115b15612243576121aa606461185c6012548861243f90919063ffffffff16565b9050601254601454826121bd91906130b0565b6121c791906130c7565b601e60008282546121d891906130e9565b90915550506012546015546121ed90836130b0565b6121f791906130c7565b601f600082825461220891906130e9565b909155505060125460135461221d90836130b0565b61222791906130c7565b601d600082825461223891906130e9565b909155506123209050565b6001600160a01b03871660009081526022602052604090205460ff16801561226d57506000600e54115b156123205761228c606461185c600e548861243f90919063ffffffff16565b9050600e546010548261229f91906130b0565b6122a991906130c7565b601e60008282546122ba91906130e9565b9091555050600e546011546122cf90836130b0565b6122d991906130c7565b601f60008282546122ea91906130e9565b9091555050600e54600f546122ff90836130b0565b61230991906130c7565b601d600082825461231a91906130e9565b90915550505b801561233157612331873083612503565b61233b818661319d565b94505b612349878787612503565b50505050505050565b600081848411156123765760405162461bcd60e51b8152600401610b9d9190612d84565b506000612383848661319d565b95945050505050565b60008061239983856130e9565b905083811015610cbc5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b9d565b6001600160a01b038216600081815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60008260000361245157506000610b6d565b600061245d83856130b0565b90508261246a85836130c7565b14610cbc5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b9d565b6000610cbc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612a73565b6001600160a01b0383166125295760405162461bcd60e51b8152600401610b9d90613115565b6001600160a01b03821661254f5760405162461bcd60e51b8152600401610b9d9061315a565b61258c816040518060600160405280602681526020016132a0602691396001600160a01b0386166000908152600460205260409020549190612352565b6001600160a01b0380851660009081526004602052604080822093909355908416815220546125bb908261238c565b6001600160a01b0380841660008181526004602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611a5b9085815260200190565b6006546000906001600160a01b031615610cb8576006546040516323b872dd60e01b81526001600160a01b038681166004830152858116602483015260448201859052909116906323b872dd906064016020604051808303816000875af115801561267e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a291906131b0565b9050610cbc565b3060009081526004602052604081205490506000601f54601d54601e546126d091906130e9565b6126da91906130e9565b905060008215806126e9575081155b156126f357505050565b60195461270190600a6130b0565b8311156127195760195461271690600a6130b0565b92505b6000600283601e548661272c91906130b0565b61273691906130c7565b61274091906130c7565b9050600061274e8583612aa1565b90504761275a82612ae3565b60006127664783612aa1565b905060006127838761185c601d548561243f90919063ffffffff16565b905060006127a08861185c601f548661243f90919063ffffffff16565b90506000816127af848661319d565b6127b9919061319d565b6000601e819055601d819055601f8190556017546040519293506001600160a01b031691849181818185875af1925050503d8060008114612816576040519150601f19603f3d011682016040523d82523d6000602084013e61281b565b606091505b5090985050861580159061282f5750600081115b156128825761283e8782612ca3565b601e54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6016546040516001600160a01b03909116904790600081818185875af1925050503d80600081146128cf576040519150601f19603f3d011682016040523d82523d6000602084013e6128d4565b606091505b50505050505050505050505050565b42600a556040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166004820152600090819030906370a0823190602401602060405180830381865afa158015612950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297491906130fc565b9050600061299361271061185c6007548561243f90919063ffffffff16565b905080156129c8576129c87f000000000000000000000000000000000000000000000000000000000000000061dead83612503565b60007f00000000000000000000000000000000000000000000000000000000000000009050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a2857600080fd5b505af1158015612a3c573d6000803e3d6000fd5b50506040517f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d925060009150a16001935050505090565b60008183612a945760405162461bcd60e51b8152600401610b9d9190612d84565b50600061238384866130c7565b6000610cbc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612352565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612b1857612b186131cd565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bba91906131e3565b81600181518110612bcd57612bcd6131cd565b60200260200101906001600160a01b031690816001600160a01b031681525050612c18307f000000000000000000000000000000000000000000000000000000000000000084611943565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790612c6d908590600090869030904290600401613200565b600060405180830381600087803b158015612c8757600080fd5b505af1158015612c9b573d6000803e3d6000fd5b505050505050565b612cce307f000000000000000000000000000000000000000000000000000000000000000084611943565b60405163f305d71960e01b815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015612d58573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d7d9190613271565b5050505050565b600060208083528351808285015260005b81811015612db157858101830151858201604001528201612d95565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612de757600080fd5b50565b8035610dce81612dd2565b60008060408385031215612e0857600080fd5b8235612e1381612dd2565b946020939093013593505050565b600060208284031215612e3357600080fd5b8135610cbc81612dd2565b600060208284031215612e5057600080fd5b5035919050565b600080600060608486031215612e6c57600080fd5b8335612e7781612dd2565b92506020840135612e8781612dd2565b929592945050506040919091013590565b8015158114612de757600080fd5b600060a08284031215612eb857600080fd5b60405160a0810181811067ffffffffffffffff82111715612ee957634e487b7160e01b600052604160045260246000fd5b6040528235612ef781612e98565b81526020830135612f0781612e98565b6020820152612f1860408401612dea565b6040820152612f2960608401612dea565b6060820152608083013560808201528091505092915050565b600080600060608486031215612f5757600080fd5b83359250602084013591506040840135612f7081612e98565b809150509250925092565b60008060408385031215612f8e57600080fd5b8235612f9981612dd2565b91506020830135612fa981612e98565b809150509250929050565b600080600060608486031215612fc957600080fd5b505081359360208301359350604090920135919050565b600060208284031215612ff257600080fd5b8135610cbc81612e98565b6000806040838503121561301057600080fd5b823561301b81612dd2565b91506020830135612fa981612dd2565b600181811c9082168061303f57607f821691505b60208210810361305f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b6d57610b6d61309a565b6000826130e457634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610b6d57610b6d61309a565b60006020828403121561310e57600080fd5b5051919050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610b6d57610b6d61309a565b6000602082840312156131c257600080fd5b8151610cbc81612e98565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156131f557600080fd5b8151610cbc81612dd2565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132505784516001600160a01b03168352938301939183019160010161322b565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561328657600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201a31b1047cc3ac156a9ec2a8b4733ddbc30f58893ad0c751c9550aabbef7e8f264736f6c634300081300334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x6080604052600436106103905760003560e01c80638da5cb5b116101dc578063c024666811610102578063d85ba063116100a0578063f2fde38b1161006f578063f2fde38b14610a5e578063f637434214610a7e578063f8b45b0514610a94578063fe72b27a14610aaa57600080fd5b8063d85ba063146109d6578063dd62ed3e146109ec578063e2f4560514610a32578063f11a24d314610a4857600080fd5b8063c876d0b9116100dc578063c876d0b914610970578063c8c8ebe41461098a578063cc2ffe7c146109a0578063d257b34f146109b657600080fd5b8063c024666814610910578063c17b5b8c14610930578063c18bc1951461095057600080fd5b80639ec22c0e1161017a578063a4c82a0011610149578063a4c82a001461088b578063a9059cbb146108a1578063b62496f5146108c1578063bbc0c742146108f157600080fd5b80639ec22c0e146108295780639fccce321461083f578063a0d82dc514610855578063a457c2d71461086b57600080fd5b8063924de9b7116101b6578063924de9b7146107be57806395d89b41146107de5780639a7a23d6146107f35780639c3b4fdc1461081357600080fd5b80638da5cb5b146107605780638ea5220f1461077e5780639075becf1461079e57600080fd5b806339509351116102c15780636b2fb1241161025f578063730c18881161022e578063730c1888146106eb5780637571336a1461070b5780638095d5641461072b5780638a8c523c1461074b57600080fd5b80636b2fb1241461066a5780636ddd17131461068057806370a08231146106a0578063715018a6146106d657600080fd5b80634a62bb651161029b5780634a62bb65146105ec5780634fbee193146106065780635c068a8c1461063e5780636a486a8e1461065457600080fd5b8063395093511461057857806349bd5a5e146105985780634a5211f0146105cc57600080fd5b80631a8145bb1161032e57806327c8f8351161030857806327c8f835146105165780632c3e486c1461052c5780632e82f1a014610542578063313ce5671461055c57600080fd5b80631a8145bb146104be578063203e727e146104d457806323b872dd146104f657600080fd5b80631694505e1161036a5780631694505e1461042757806318160ddd14610473578063184c16c514610492578063199ffc72146104a857600080fd5b806306fdde031461039c578063095ea7b3146103c757806310d5de53146103f757600080fd5b3661039757005b600080fd5b3480156103a857600080fd5b506103b1610aca565b6040516103be9190612d84565b60405180910390f35b3480156103d357600080fd5b506103e76103e2366004612df5565b610b5c565b60405190151581526020016103be565b34801561040357600080fd5b506103e7610412366004612e21565b60216020526000908152604090205460ff1681565b34801561043357600080fd5b5061045b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016103be565b34801561047f57600080fd5b506001545b6040519081526020016103be565b34801561049e57600080fd5b50610484600b5481565b3480156104b457600080fd5b5061048460075481565b3480156104ca57600080fd5b50610484601e5481565b3480156104e057600080fd5b506104f46104ef366004612e3e565b610b73565b005b34801561050257600080fd5b506103e7610511366004612e57565b610c59565b34801561052257600080fd5b5061045b61dead81565b34801561053857600080fd5b5061048460095481565b34801561054e57600080fd5b506008546103e79060ff1681565b34801561056857600080fd5b50604051601281526020016103be565b34801561058457600080fd5b506103e7610593366004612df5565b610cc3565b3480156105a457600080fd5b5061045b7f0000000000000000000000004e2a140ed27b9bad3a63bc9bd481554113400f7481565b3480156105d857600080fd5b506103e76105e7366004612ea6565b610cf9565b3480156105f857600080fd5b50600d546103e79060ff1681565b34801561061257600080fd5b506103e7610621366004612e21565b6001600160a01b0316600090815260208052604090205460ff1690565b34801561064a57600080fd5b50610484600f5481565b34801561066057600080fd5b5061048460125481565b34801561067657600080fd5b5061048460135481565b34801561068c57600080fd5b50600d546103e79062010000900460ff1681565b3480156106ac57600080fd5b506104846106bb366004612e21565b6001600160a01b031660009081526004602052604090205490565b3480156106e257600080fd5b506104f4610dd3565b3480156106f757600080fd5b506104f4610706366004612f42565b610e47565b34801561071757600080fd5b506104f4610726366004612f7b565b610f70565b34801561073757600080fd5b506104f4610746366004612fb4565b610fc5565b34801561075757600080fd5b506104f461106d565b34801561076c57600080fd5b506000546001600160a01b031661045b565b34801561078a57600080fd5b5060175461045b906001600160a01b031681565b3480156107aa57600080fd5b5060165461045b906001600160a01b031681565b3480156107ca57600080fd5b506104f46107d9366004612fe0565b611106565b3480156107ea57600080fd5b506103b161114c565b3480156107ff57600080fd5b506104f461080e366004612f7b565b61115b565b34801561081f57600080fd5b5061048460115481565b34801561083557600080fd5b50610484600c5481565b34801561084b57600080fd5b50610484601f5481565b34801561086157600080fd5b5061048460155481565b34801561087757600080fd5b506103e7610886366004612df5565b61123a565b34801561089757600080fd5b50610484600a5481565b3480156108ad57600080fd5b506103e76108bc366004612df5565b611289565b3480156108cd57600080fd5b506103e76108dc366004612e21565b60226020526000908152604090205460ff1681565b3480156108fd57600080fd5b50600d546103e790610100900460ff1681565b34801561091c57600080fd5b506104f461092b366004612f7b565b611296565b34801561093c57600080fd5b506104f461094b366004612fb4565b61131d565b34801561095c57600080fd5b506104f461096b366004612e3e565b6113c0565b34801561097c57600080fd5b50601c546103e79060ff1681565b34801561099657600080fd5b5061048460185481565b3480156109ac57600080fd5b50610484601d5481565b3480156109c257600080fd5b506103e76109d1366004612e3e565b611491565b3480156109e257600080fd5b50610484600e5481565b3480156109f857600080fd5b50610484610a07366004612ffd565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b348015610a3e57600080fd5b5061048460195481565b348015610a5457600080fd5b5061048460105481565b348015610a6a57600080fd5b506104f4610a79366004612e21565b6115e1565b348015610a8a57600080fd5b5061048460145481565b348015610aa057600080fd5b50610484601a5481565b348015610ab657600080fd5b506103e7610ac5366004612e3e565b6116cb565b606060028054610ad99061302b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b059061302b565b8015610b525780601f10610b2757610100808354040283529160200191610b52565b820191906000526020600020905b815481529060010190602001808311610b3557829003601f168201915b5050505050905090565b6000610b69338484611943565b5060015b92915050565b6000546001600160a01b03163314610ba65760405162461bcd60e51b8152600401610b9d90613065565b60405180910390fd5b670de0b6b3a76400006103e8610bbb60015490565b610bc69060016130b0565b610bd091906130c7565b610bda91906130c7565b811015610c415760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e312560881b6064820152608401610b9d565b610c5381670de0b6b3a76400006130b0565b60185550565b6000610c66848484611a68565b610cb88433610cb3856040518060600160405280602881526020016132c6602891396001600160a01b038a1660009081526005602090815260408083203384529091529020549190612352565b611943565b5060015b9392505050565b3360008181526005602090815260408083206001600160a01b03871684529091528120549091610b69918590610cb3908661238c565b600080546001600160a01b03163314610d245760405162461bcd60e51b8152600401610b9d90613065565b8151600d805491151560ff199283161790556020830151601c805491151591909216179055604082015160608301516080840151610da19291906001600160a01b039283166000908152600560209081526040808320949095168083529390529290922091909155600680546001600160a01b0319169091179055565b6040517f56cd40e702ad44e23718371585a7a88bfb79ab8ea81a03c7f8945fabc3c279cf90600090a15060015b919050565b6000546001600160a01b03163314610dfd5760405162461bcd60e51b8152600401610b9d90613065565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610e715760405162461bcd60e51b8152600401610b9d90613065565b610258831015610edf5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f7420736574206275796261636b206d6f7265206f6674656e207468604482015272616e206576657279203130206d696e7574657360681b6064820152608401610b9d565b6103e88211158015610eef575060015b610f545760405162461bcd60e51b815260206004820152603060248201527f4d75737420736574206175746f204c50206275726e2070657263656e7420626560448201526f747765656e20302520616e642031302560801b6064820152608401610b9d565b6009929092556007556008805460ff1916911515919091179055565b6000546001600160a01b03163314610f9a5760405162461bcd60e51b8152600401610b9d90613065565b6001600160a01b03919091166000908152602160205260409020805460ff1916911515919091179055565b6000546001600160a01b03163314610fef5760405162461bcd60e51b8152600401610b9d90613065565b600f839055601082905560118190558061100983856130e9565b61101391906130e9565b600e819055601410156110685760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610b9d565b505050565b6000546001600160a01b031633146110975760405162461bcd60e51b8152600401610b9d90613065565b600d54610100900460ff16156110ef5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610b9d565b600d805462ffff0019166201010017905542600a55565b6000546001600160a01b031633146111305760405162461bcd60e51b8152600401610b9d90613065565b600d8054911515620100000262ff000019909216919091179055565b606060038054610ad99061302b565b6000546001600160a01b031633146111855760405162461bcd60e51b8152600401610b9d90613065565b7f0000000000000000000000004e2a140ed27b9bad3a63bc9bd481554113400f746001600160a01b0316826001600160a01b03160361122c5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610b9d565b61123682826123eb565b5050565b6000610b693384610cb3856040518060600160405280602581526020016132ee602591393360009081526005602090815260408083206001600160a01b038d1684529091529020549190612352565b6000610b69338484611a68565b6000546001600160a01b031633146112c05760405162461bcd60e51b8152600401610b9d90613065565b6001600160a01b03821660008181526020808052604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6000546001600160a01b031633146113475760405162461bcd60e51b8152600401610b9d90613065565b6013839055601482905560158190558061136183856130e9565b61136b91906130e9565b6012819055601410156110685760405162461bcd60e51b815260206004820152601d60248201527f4d757374206b656570206665657320617420323025206f72206c6573730000006044820152606401610b9d565b6000546001600160a01b031633146113ea5760405162461bcd60e51b8152600401610b9d90613065565b670de0b6b3a76400006103e86113ff60015490565b61140a9060056130b0565b61141491906130c7565b61141e91906130c7565b8110156114795760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263302e352560e01b6064820152608401610b9d565b61148b81670de0b6b3a76400006130b0565b601a5550565b600080546001600160a01b031633146114bc5760405162461bcd60e51b8152600401610b9d90613065565b620186a06114c960015490565b6114d49060016130b0565b6114de91906130c7565b82101561154b5760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610b9d565b6103e861155760015490565b6115629060056130b0565b61156c91906130c7565b8211156115d85760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610b9d565b50601955600190565b6000546001600160a01b0316331461160b5760405162461bcd60e51b8152600401610b9d90613065565b6001600160a01b0381166116705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b9d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b031633146116f65760405162461bcd60e51b8152600401610b9d90613065565b600b54600c5461170691906130e9565b42116117545760405162461bcd60e51b815260206004820181905260248201527f4d757374207761697420666f7220636f6f6c646f776e20746f2066696e6973686044820152606401610b9d565b6103e88211156117b95760405162461bcd60e51b815260206004820152602a60248201527f4d6179206e6f74206e756b65206d6f7265207468616e20313025206f6620746f60448201526906b656e7320696e204c560b41b6064820152608401610b9d565b42600c556040516370a0823160e01b81526001600160a01b037f0000000000000000000000004e2a140ed27b9bad3a63bc9bd481554113400f7416600482015260009030906370a0823190602401602060405180830381865afa158015611824573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184891906130fc565b9050600061186261271061185c848761243f565b906124c1565b90508015611897576118977f0000000000000000000000004e2a140ed27b9bad3a63bc9bd481554113400f7461dead83612503565b60007f0000000000000000000000004e2a140ed27b9bad3a63bc9bd481554113400f749050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156118f757600080fd5b505af115801561190b573d6000803e3d6000fd5b50506040517f8462566617872a3fbab94534675218431ff9e204063ee3f4f43d965626a39abb925060009150a1506001949350505050565b6001600160a01b0383166119a55760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610b9d565b6001600160a01b038216611a065760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610b9d565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611a8e5760405162461bcd60e51b8152600401610b9d90613115565b6001600160a01b038216611ab45760405162461bcd60e51b8152600401610b9d9061315a565b80600003611ac85761106883836000612503565b600d5460ff1615611f83576000546001600160a01b03848116911614801590611aff57506000546001600160a01b03838116911614155b8015611b1357506001600160a01b03821615155b8015611b2a57506001600160a01b03821661dead14155b8015611b405750600d546301000000900460ff16155b15611f8357600d54610100900460ff16611bd6576001600160a01b038316600090815260208052604090205460ff1680611b9157506001600160a01b038216600090815260208052604090205460ff165b611bd65760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610b9d565b601c5460ff1615611d1d576000546001600160a01b03838116911614801590611c3157507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b8015611c6f57507f0000000000000000000000004e2a140ed27b9bad3a63bc9bd481554113400f746001600160a01b0316826001600160a01b031614155b15611d1d57326000908152601b60205260409020544311611d0a5760405162461bcd60e51b815260206004820152604960248201527f5f7472616e736665723a3a205472616e736665722044656c617920656e61626c60448201527f65642e20204f6e6c79206f6e652070757263686173652070657220626c6f636b6064820152681030b63637bbb2b21760b91b608482015260a401610b9d565b326000908152601b602052604090204390555b6001600160a01b03831660009081526022602052604090205460ff168015611d5e57506001600160a01b03821660009081526021602052604090205460ff16155b15611e4257601854811115611dd35760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610b9d565b601a546001600160a01b038316600090815260046020526040902054611df990836130e9565b1115611e3d5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b9d565b611f83565b6001600160a01b03821660009081526022602052604090205460ff168015611e8357506001600160a01b03831660009081526021602052604090205460ff16155b15611ef957601854811115611e3d5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610b9d565b6001600160a01b03821660009081526021602052604090205460ff16611f8357601a546001600160a01b038316600090815260046020526040902054611f3f90836130e9565b1115611f835760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610b9d565b306000908152600460205260408120549050600060195482101580611fae5750611fae85858561260f565b9050808015611fc55750600d5462010000900460ff165b8015611fdb5750600d546301000000900460ff16155b801561200057506001600160a01b03851660009081526022602052604090205460ff16155b801561202457506001600160a01b038516600090815260208052604090205460ff16155b801561204857506001600160a01b038416600090815260208052604090205460ff16155b1561207657600d805463ff000000191663010000001790556120686126a9565b600d805463ff000000191690555b600d546301000000900460ff161580156120a857506001600160a01b03841660009081526022602052604090205460ff165b80156120b6575060085460ff165b80156120d15750600954600a546120cd91906130e9565b4210155b80156120f557506001600160a01b038516600090815260208052604090205460ff16155b15612104576121026128e3565b505b600d546001600160a01b038616600090815260208052604090205460ff630100000090920482161591168061215057506001600160a01b038516600090815260208052604090205460ff165b15612159575060005b6000811561233e576001600160a01b03861660009081526022602052604090205460ff16801561218b57506000601254115b15612243576121aa606461185c6012548861243f90919063ffffffff16565b9050601254601454826121bd91906130b0565b6121c791906130c7565b601e60008282546121d891906130e9565b90915550506012546015546121ed90836130b0565b6121f791906130c7565b601f600082825461220891906130e9565b909155505060125460135461221d90836130b0565b61222791906130c7565b601d600082825461223891906130e9565b909155506123209050565b6001600160a01b03871660009081526022602052604090205460ff16801561226d57506000600e54115b156123205761228c606461185c600e548861243f90919063ffffffff16565b9050600e546010548261229f91906130b0565b6122a991906130c7565b601e60008282546122ba91906130e9565b9091555050600e546011546122cf90836130b0565b6122d991906130c7565b601f60008282546122ea91906130e9565b9091555050600e54600f546122ff90836130b0565b61230991906130c7565b601d600082825461231a91906130e9565b90915550505b801561233157612331873083612503565b61233b818661319d565b94505b612349878787612503565b50505050505050565b600081848411156123765760405162461bcd60e51b8152600401610b9d9190612d84565b506000612383848661319d565b95945050505050565b60008061239983856130e9565b905083811015610cbc5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b9d565b6001600160a01b038216600081815260226020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60008260000361245157506000610b6d565b600061245d83856130b0565b90508261246a85836130c7565b14610cbc5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b9d565b6000610cbc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612a73565b6001600160a01b0383166125295760405162461bcd60e51b8152600401610b9d90613115565b6001600160a01b03821661254f5760405162461bcd60e51b8152600401610b9d9061315a565b61258c816040518060600160405280602681526020016132a0602691396001600160a01b0386166000908152600460205260409020549190612352565b6001600160a01b0380851660009081526004602052604080822093909355908416815220546125bb908261238c565b6001600160a01b0380841660008181526004602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611a5b9085815260200190565b6006546000906001600160a01b031615610cb8576006546040516323b872dd60e01b81526001600160a01b038681166004830152858116602483015260448201859052909116906323b872dd906064016020604051808303816000875af115801561267e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126a291906131b0565b9050610cbc565b3060009081526004602052604081205490506000601f54601d54601e546126d091906130e9565b6126da91906130e9565b905060008215806126e9575081155b156126f357505050565b60195461270190600a6130b0565b8311156127195760195461271690600a6130b0565b92505b6000600283601e548661272c91906130b0565b61273691906130c7565b61274091906130c7565b9050600061274e8583612aa1565b90504761275a82612ae3565b60006127664783612aa1565b905060006127838761185c601d548561243f90919063ffffffff16565b905060006127a08861185c601f548661243f90919063ffffffff16565b90506000816127af848661319d565b6127b9919061319d565b6000601e819055601d819055601f8190556017546040519293506001600160a01b031691849181818185875af1925050503d8060008114612816576040519150601f19603f3d011682016040523d82523d6000602084013e61281b565b606091505b5090985050861580159061282f5750600081115b156128825761283e8782612ca3565b601e54604080518881526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6016546040516001600160a01b03909116904790600081818185875af1925050503d80600081146128cf576040519150601f19603f3d011682016040523d82523d6000602084013e6128d4565b606091505b50505050505050505050505050565b42600a556040516370a0823160e01b81526001600160a01b037f0000000000000000000000004e2a140ed27b9bad3a63bc9bd481554113400f74166004820152600090819030906370a0823190602401602060405180830381865afa158015612950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297491906130fc565b9050600061299361271061185c6007548561243f90919063ffffffff16565b905080156129c8576129c87f0000000000000000000000004e2a140ed27b9bad3a63bc9bd481554113400f7461dead83612503565b60007f0000000000000000000000004e2a140ed27b9bad3a63bc9bd481554113400f749050806001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612a2857600080fd5b505af1158015612a3c573d6000803e3d6000fd5b50506040517f454c91ae84fcc766ddda0dcb289f26b3d0176efeacf4061fc219fa6ca8c3048d925060009150a16001935050505090565b60008183612a945760405162461bcd60e51b8152600401610b9d9190612d84565b50600061238384866130c7565b6000610cbc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612352565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612b1857612b186131cd565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bba91906131e3565b81600181518110612bcd57612bcd6131cd565b60200260200101906001600160a01b031690816001600160a01b031681525050612c18307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611943565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790612c6d908590600090869030904290600401613200565b600060405180830381600087803b158015612c8757600080fd5b505af1158015612c9b573d6000803e3d6000fd5b505050505050565b612cce307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611943565b60405163f305d71960e01b815230600482015260248101839052600060448201819052606482015261dead60848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015612d58573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612d7d9190613271565b5050505050565b600060208083528351808285015260005b81811015612db157858101830151858201604001528201612d95565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612de757600080fd5b50565b8035610dce81612dd2565b60008060408385031215612e0857600080fd5b8235612e1381612dd2565b946020939093013593505050565b600060208284031215612e3357600080fd5b8135610cbc81612dd2565b600060208284031215612e5057600080fd5b5035919050565b600080600060608486031215612e6c57600080fd5b8335612e7781612dd2565b92506020840135612e8781612dd2565b929592945050506040919091013590565b8015158114612de757600080fd5b600060a08284031215612eb857600080fd5b60405160a0810181811067ffffffffffffffff82111715612ee957634e487b7160e01b600052604160045260246000fd5b6040528235612ef781612e98565b81526020830135612f0781612e98565b6020820152612f1860408401612dea565b6040820152612f2960608401612dea565b6060820152608083013560808201528091505092915050565b600080600060608486031215612f5757600080fd5b83359250602084013591506040840135612f7081612e98565b809150509250925092565b60008060408385031215612f8e57600080fd5b8235612f9981612dd2565b91506020830135612fa981612e98565b809150509250929050565b600080600060608486031215612fc957600080fd5b505081359360208301359350604090920135919050565b600060208284031215612ff257600080fd5b8135610cbc81612e98565b6000806040838503121561301057600080fd5b823561301b81612dd2565b91506020830135612fa981612dd2565b600181811c9082168061303f57607f821691505b60208210810361305f57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b6d57610b6d61309a565b6000826130e457634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115610b6d57610b6d61309a565b60006020828403121561310e57600080fd5b5051919050565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610b6d57610b6d61309a565b6000602082840312156131c257600080fd5b8151610cbc81612e98565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156131f557600080fd5b8151610cbc81612dd2565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156132505784516001600160a01b03168352938301939183019160010161322b565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561328657600080fd5b835192506020840151915060408401519050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201a31b1047cc3ac156a9ec2a8b4733ddbc30f58893ad0c751c9550aabbef7e8f264736f6c63430008130033
Deployed Bytecode Sourcemap
19976:23025:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20577:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21602:169;;;;;;;;;;-1:-1:-1;21602:169:0;;;;;:::i;:::-;;:::i;:::-;;;1327:14:1;;1320:22;1302:41;;1290:2;1275:18;21602:169:0;1162:187:1;26700:64:0;;;;;;;;;;-1:-1:-1;26700:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25127:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1797:32:1;;;1779:51;;1767:2;1752:18;25127:51:0;1606:230:1;21009:108:0;;;;;;;;;;-1:-1:-1;21097:12:0;;21009:108;;;1987:25:1;;;1975:2;1960:18;21009:108:0;1841:177:1;25490:47:0;;;;;;;;;;;;;;;;25300:36;;;;;;;;;;;;;;;;26485:33;;;;;;;;;;;;;;;;30902:234;;;;;;;;;;-1:-1:-1;30902:234:0;;;;;:::i;:::-;;:::i;:::-;;21779:355;;;;;;;;;;-1:-1:-1;21779:355:0;;;;;:::i;:::-;;:::i;25230:53::-;;;;;;;;;;;;25276:6;25230:53;;25396:45;;;;;;;;;;;;;;;;25356:33;;;;;;;;;;-1:-1:-1;25356:33:0;;;;;;;;20908:93;;;;;;;;;;-1:-1:-1;20908:93:0;;20991:2;3019:36:1;;3007:2;2992:18;20908:93:0;2877:184:1;22142:218:0;;;;;;;;;;-1:-1:-1;22142:218:0;;;;;:::i;:::-;;:::i;25185:38::-;;;;;;;;;;;;;;;30071:363;;;;;;;;;;-1:-1:-1;30071:363:0;;;;;:::i;:::-;;:::i;25588:33::-;;;;;;;;;;-1:-1:-1;25588:33:0;;;;;;;;33560:125;;;;;;;;;;-1:-1:-1;33560:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;33649:28:0;33625:4;33649:28;;;:19;:28;;;;;;;;;33560:125;25774:29;;;;;;;;;;;;;;;;25884:28;;;;;;;;;;;;;;;;25919:30;;;;;;;;;;;;;;;;25668:31;;;;;;;;;;-1:-1:-1;25668:31:0;;;;;;;;;;;21125:127;;;;;;;;;;-1:-1:-1;21125:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;21226:18:0;21199:7;21226:18;;;:9;:18;;;;;;;21125:127;12603:148;;;;;;;;;;;;;:::i;40719:447::-;;;;;;;;;;-1:-1:-1;40719:447:0;;;;;:::i;:::-;;:::i;32764:144::-;;;;;;;;;;-1:-1:-1;32764:144:0;;;;;:::i;:::-;;:::i;31547:365::-;;;;;;;;;;-1:-1:-1;31547:365:0;;;;;:::i;:::-;;:::i;29798:217::-;;;;;;;;;;;;;:::i;11961:79::-;;;;;;;;;;-1:-1:-1;11999:7:0;12026:6;-1:-1:-1;;;;;12026:6:0;11961:79;;26062:24;;;;;;;;;;-1:-1:-1;26062:24:0;;;;-1:-1:-1;;;;;26062:24:0;;;26026:29;;;;;;;;;;-1:-1:-1;26026:29:0;;;;-1:-1:-1;;;;;26026:29:0;;;33008:101;;;;;;;;;;-1:-1:-1;33008:101:0;;;;;:::i;:::-;;:::i;20796:104::-;;;;;;;;;;;;;:::i;31926:244::-;;;;;;;;;;-1:-1:-1;31926:244:0;;;;;:::i;:::-;;:::i;25847:24::-;;;;;;;;;;;;;;;;25544:35;;;;;;;;;;;;;;;;26525:27;;;;;;;;;;;;;;;;25994:25;;;;;;;;;;;;;;;;22368:269;;;;;;;;;;-1:-1:-1;22368:269:0;;;;;:::i;:::-;;:::i;25448:29::-;;;;;;;;;;;;;;;;21260:175;;;;;;;;;;-1:-1:-1;21260:175:0;;;;;:::i;:::-;;:::i;26922:58::-;;;;;;;;;;-1:-1:-1;26922:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25628:33;;;;;;;;;;-1:-1:-1;25628:33:0;;;;;;;;;;;33117:182;;;;;;;;;;-1:-1:-1;33117:182:0;;;;;:::i;:::-;;:::i;32378:374::-;;;;;;;;;;-1:-1:-1;32378:374:0;;;;;:::i;:::-;;:::i;31324:215::-;;;;;;;;;;-1:-1:-1;31324:215:0;;;;;:::i;:::-;;:::i;26391:40::-;;;;;;;;;;-1:-1:-1;26391:40:0;;;;;;;;26093:35;;;;;;;;;;;;;;;;26446:32;;;;;;;;;;;;;;;;30509:381;;;;;;;;;;-1:-1:-1;30509:381:0;;;;;:::i;:::-;;:::i;25740:27::-;;;;;;;;;;;;;;;;21443:151;;;;;;;;;;-1:-1:-1;21443:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;21559:18:0;;;21532:7;21559:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21443:151;26135:33;;;;;;;;;;;;;;;;25810:30;;;;;;;;;;;;;;;;12906:244;;;;;;;;;;-1:-1:-1;12906:244:0;;;;;:::i;:::-;;:::i;25956:31::-;;;;;;;;;;;;;;;;26175:24;;;;;;;;;;;;;;;;41978:1020;;;;;;;;;;-1:-1:-1;41978:1020:0;;;;;:::i;:::-;;:::i;20577:100::-;20631:13;20664:5;20657:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20577:100;:::o;21602:169::-;21685:4;21702:39;11197:10;21725:7;21734:6;21702:8;:39::i;:::-;-1:-1:-1;21759:4:0;21602:169;;;;;:::o;30902:234::-;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;;;;;;;;;31021:4:::1;31015;30995:13;21097:12:::0;;;21009:108;30995:13:::1;:17;::::0;31011:1:::1;30995:17;:::i;:::-;:24;;;;:::i;:::-;30994:31;;;;:::i;:::-;30984:6;:41;;30976:101;;;::::0;-1:-1:-1;;;30976:101:0;;7486:2:1;30976:101:0::1;::::0;::::1;7468:21:1::0;7525:2;7505:18;;;7498:30;7564:34;7544:18;;;7537:62;-1:-1:-1;;;7615:18:1;;;7608:45;7670:19;;30976:101:0::1;7284:411:1::0;30976:101:0::1;31111:17;:6:::0;31121::::1;31111:17;:::i;:::-;31088:20;:40:::0;-1:-1:-1;30902:234:0:o;21779:355::-;21919:4;21936:36;21946:6;21954:9;21965:6;21936:9;:36::i;:::-;21983:121;21992:6;11197:10;22014:89;22052:6;22014:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22014:19:0;;;;;;:11;:19;;;;;;;;11197:10;22014:33;;;;;;;;;;:37;:89::i;:::-;21983:8;:121::i;:::-;-1:-1:-1;22122:4:0;21779:355;;;;;;:::o;22142:218::-;11197:10;22230:4;22279:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;22279:34:0;;;;;;;;;;22230:4;;22247:83;;22270:7;;22279:50;;22318:10;22279:38;:50::i;30071:363::-;30157:4;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;30190:27;;30173:14:::1;:44:::0;;;::::1;;-1:-1:-1::0;;30173:44:0;;::::1;;::::0;;30251:33:::1;::::0;::::1;::::0;30228:20:::1;:56:::0;;;::::1;;::::0;;;::::1;;::::0;;30310:20:::1;::::0;::::1;::::0;30332::::1;::::0;::::1;::::0;30354:19:::1;::::0;::::1;::::0;30295:79:::1;::::0;30310:20;30332;-1:-1:-1;;;;;31239:21:0;;;;;;;:11;:21;;;;;;;;:31;;;;;;;;;;;;;;:40;;;;31290:7;:18;;-1:-1:-1;;;;;;31290:18:0;;;;;;31144:172;30295:79:::1;30390:14;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;30422:4:0::1;12243:1;30071:363:::0;;;:::o;12603:148::-;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;12710:1:::1;12694:6:::0;;12673:40:::1;::::0;-1:-1:-1;;;;;12694:6:0;;::::1;::::0;12673:40:::1;::::0;12710:1;;12673:40:::1;12741:1;12724:19:::0;;-1:-1:-1;;;;;;12724:19:0::1;::::0;;12603:148::o;40719:447::-;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;40873:3:::1;40850:19;:26;;40842:90;;;::::0;-1:-1:-1;;;40842:90:0;;7902:2:1;40842:90:0::1;::::0;::::1;7884:21:1::0;7941:2;7921:18;;;7914:30;7980:34;7960:18;;;7953:62;-1:-1:-1;;;8031:18:1;;;8024:49;8090:19;;40842:90:0::1;7700:415:1::0;40842:90:0::1;40963:4;40951:8;:16;;:33;;;;-1:-1:-1::0;40971:13:0;40951:33:::1;40943:94;;;::::0;-1:-1:-1;;;40943:94:0;;8322:2:1;40943:94:0::1;::::0;::::1;8304:21:1::0;8361:2;8341:18;;;8334:30;8400:34;8380:18;;;8373:62;-1:-1:-1;;;8451:18:1;;;8444:46;8507:19;;40943:94:0::1;8120:412:1::0;40943:94:0::1;41048:15;:37:::0;;;;41096:16:::1;:27:::0;41134:13:::1;:24:::0;;-1:-1:-1;;41134:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40719:447::o;32764:144::-;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32854:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;32854:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32764:144::o;31547:365::-;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;31662:14:::1;:29:::0;;;31702:15:::1;:31:::0;;;31744:9:::1;:19:::0;;;31756:7;31789:32:::1;31720:13:::0;31679:12;31789:32:::1;:::i;:::-;:44;;;;:::i;:::-;31774:12;:59:::0;;;31868:2:::1;-1:-1:-1::0;31852:18:0::1;31844:60;;;::::0;-1:-1:-1;;;31844:60:0;;8869:2:1;31844:60:0::1;::::0;::::1;8851:21:1::0;8908:2;8888:18;;;8881:30;8947:31;8927:18;;;8920:59;8996:18;;31844:60:0::1;8667:353:1::0;31844:60:0::1;31547:365:::0;;;:::o;29798:217::-;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;29862:13:::1;::::0;::::1;::::0;::::1;;;29861:14;29853:51;;;::::0;-1:-1:-1;;;29853:51:0;;9227:2:1;29853:51:0::1;::::0;::::1;9209:21:1::0;9266:2;9246:18;;;9239:30;9305:26;9285:18;;;9278:54;9349:18;;29853:51:0::1;9025:348:1::0;29853:51:0::1;29915:13;:20:::0;;-1:-1:-1;;29946:18:0;;;;;29992:15:::1;29975:14;:32:::0;29798:217::o;33008:101::-;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;33080:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;33080:21:0;;::::1;::::0;;;::::1;::::0;;33008:101::o;20796:104::-;20852:13;20885:7;20878:14;;;;;:::i;31926:244::-;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;32033:13:::1;-1:-1:-1::0;;;;;32025:21:0::1;:4;-1:-1:-1::0;;;;;32025:21:0::1;::::0;32017:91:::1;;;::::0;-1:-1:-1;;;32017:91:0;;9580:2:1;32017:91:0::1;::::0;::::1;9562:21:1::0;9619:2;9599:18;;;9592:30;9658:34;9638:18;;;9631:62;9729:27;9709:18;;;9702:55;9774:19;;32017:91:0::1;9378:421:1::0;32017:91:0::1;32121:41;32150:4;32156:5;32121:28;:41::i;:::-;31926:244:::0;;:::o;22368:269::-;22461:4;22478:129;11197:10;22501:7;22510:96;22549:15;22510:96;;;;;;;;;;;;;;;;;11197:10;22510:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;22510:34:0;;;;;;;;;;;;:38;:96::i;21260:175::-;21346:4;21363:42;11197:10;21387:9;21398:6;21363:9;:42::i;33117:182::-;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33202:28:0;::::1;;::::0;;;:19:::1;:28:::0;;;;;;;;:39;;-1:-1:-1;;33202:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;33257:34;;1302:41:1;;;33257:34:0::1;::::0;1275:18:1;33257:34:0::1;;;;;;;33117:182:::0;;:::o;32378:374::-;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;32494:15:::1;:30:::0;;;32535:16:::1;:32:::0;;;32578:10:::1;:20:::0;;;32591:7;32625:34:::1;32554:13:::0;32512:12;32625:34:::1;:::i;:::-;:47;;;;:::i;:::-;32609:13;:63:::0;;;32708:2:::1;-1:-1:-1::0;32691:19:0::1;32683:61;;;::::0;-1:-1:-1;;;32683:61:0;;8869:2:1;32683:61:0::1;::::0;::::1;8851:21:1::0;8908:2;8888:18;;;8881:30;8947:31;8927:18;;;8920:59;8996:18;;32683:61:0::1;8667:353:1::0;31324:215:0;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;31446:4:::1;31440;31420:13;21097:12:::0;;;21009:108;31420:13:::1;:17;::::0;31436:1:::1;31420:17;:::i;:::-;:24;;;;:::i;:::-;31419:31;;;;:::i;:::-;31409:6;:41;;31401:90;;;::::0;-1:-1:-1;;;31401:90:0;;10006:2:1;31401:90:0::1;::::0;::::1;9988:21:1::0;10045:2;10025:18;;;10018:30;10084:34;10064:18;;;10057:62;-1:-1:-1;;;10135:18:1;;;10128:34;10179:19;;31401:90:0::1;9804:400:1::0;31401:90:0::1;31514:17;:6:::0;31524::::1;31514:17;:::i;:::-;31502:9;:29:::0;-1:-1:-1;31324:215:0:o;30509:381::-;30590:4;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;30646:6:::1;30626:13;21097:12:::0;;;21009:108;30626:13:::1;:17;::::0;30642:1:::1;30626:17;:::i;:::-;:26;;;;:::i;:::-;30613:9;:39;;30605:105;;;::::0;-1:-1:-1;;;30605:105:0;;10411:2:1;30605:105:0::1;::::0;::::1;10393:21:1::0;10450:2;10430:18;;;10423:30;10489:34;10469:18;;;10462:62;-1:-1:-1;;;10540:18:1;;;10533:51;10601:19;;30605:105:0::1;10209:417:1::0;30605:105:0::1;30761:4;30741:13;21097:12:::0;;;21009:108;30741:13:::1;:17;::::0;30757:1:::1;30741:17;:::i;:::-;:24;;;;:::i;:::-;30728:9;:37;;30720:102;;;::::0;-1:-1:-1;;;30720:102:0;;10833:2:1;30720:102:0::1;::::0;::::1;10815:21:1::0;10872:2;10852:18;;;10845:30;10911:34;10891:18;;;10884:62;-1:-1:-1;;;10962:18:1;;;10955:50;11022:19;;30720:102:0::1;10631:416:1::0;30720:102:0::1;-1:-1:-1::0;30832:18:0::1;:30:::0;30879:4:::1;::::0;30509:381::o;12906:244::-;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12995:22:0;::::1;12987:73;;;::::0;-1:-1:-1;;;12987:73:0;;11254:2:1;12987:73:0::1;::::0;::::1;11236:21:1::0;11293:2;11273:18;;;11266:30;11332:34;11312:18;;;11305:62;-1:-1:-1;;;11383:18:1;;;11376:36;11429:19;;12987:73:0::1;11052:402:1::0;12987:73:0::1;13097:6;::::0;;13076:38:::1;::::0;-1:-1:-1;;;;;13076:38:0;;::::1;::::0;13097:6;::::1;::::0;13076:38:::1;::::0;::::1;13125:6;:17:::0;;-1:-1:-1;;;;;;13125:17:0::1;-1:-1:-1::0;;;;;13125:17:0;;;::::1;::::0;;;::::1;::::0;;12906:244::o;41978:1020::-;42062:4;12173:6;;-1:-1:-1;;;;;12173:6:0;11197:10;12173:22;12165:67;;;;-1:-1:-1;;;12165:67:0;;;;;;;:::i;:::-;42127:19:::1;;42104:20;;:42;;;;:::i;:::-;42086:15;:60;42078:106;;;::::0;-1:-1:-1;;;42078:106:0;;11661:2:1;42078:106:0::1;::::0;::::1;11643:21:1::0;;;11680:18;;;11673:30;11739:34;11719:18;;;11712:62;11791:18;;42078:106:0::1;11459:356:1::0;42078:106:0::1;42214:4;42203:7;:15;;42195:70;;;::::0;-1:-1:-1;;;42195:70:0;;12022:2:1;42195:70:0::1;::::0;::::1;12004:21:1::0;12061:2;12041:18;;;12034:30;12100:34;12080:18;;;12073:62;-1:-1:-1;;;12151:18:1;;;12144:40;12201:19;;42195:70:0::1;11820:406:1::0;42195:70:0::1;42299:15;42276:20;:38:::0;42408:29:::1;::::0;-1:-1:-1;;;42408:29:0;;-1:-1:-1;;;;;42423:13:0::1;1797:32:1::0;42408:29:0::1;::::0;::::1;1779:51:1::0;42377:28:0::1;::::0;42408:4:::1;::::0;:14:::1;::::0;1752:18:1;;42408:29:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42377:60:::0;-1:-1:-1;42495:20:0::1;42518:44;42556:5;42518:33;42377:60:::0;42543:7;42518:24:::1;:33::i;:::-;:37:::0;::::1;:44::i;:::-;42495:67:::0;-1:-1:-1;42675:16:0;;42671:111:::1;;42707:63;42725:13;42748:6;42757:12;42707:17;:63::i;:::-;42865:19;42902:13;42865:51;;42927:4;-1:-1:-1::0;;;;;42927:9:0::1;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42954:14:0::1;::::0;::::1;::::0;-1:-1:-1;42954:14:0;;-1:-1:-1;42954:14:0::1;-1:-1:-1::0;42986:4:0::1;::::0;41978:1020;-1:-1:-1;;;;41978:1020:0:o;24606:380::-;-1:-1:-1;;;;;24742:19:0;;24734:68;;;;-1:-1:-1;;;24734:68:0;;12622:2:1;24734:68:0;;;12604:21:1;12661:2;12641:18;;;12634:30;12700:34;12680:18;;;12673:62;-1:-1:-1;;;12751:18:1;;;12744:34;12795:19;;24734:68:0;12420:400:1;24734:68:0;-1:-1:-1;;;;;24821:21:0;;24813:68;;;;-1:-1:-1;;;24813:68:0;;13027:2:1;24813:68:0;;;13009:21:1;13066:2;13046:18;;;13039:30;13105:34;13085:18;;;13078:62;-1:-1:-1;;;13156:18:1;;;13149:32;13198:19;;24813:68:0;12825:398:1;24813:68:0;-1:-1:-1;;;;;24894:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24946:32;;1987:25:1;;;24946:32:0;;1960:18:1;24946:32:0;;;;;;;;24606:380;;;:::o;33693:4330::-;-1:-1:-1;;;;;33816:18:0;;33808:68;;;;-1:-1:-1;;;33808:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33895:16:0;;33887:64;;;;-1:-1:-1;;;33887:64:0;;;;;;;:::i;:::-;33976:6;33986:1;33976:11;33973:94;;34004:30;34022:4;34028:2;34032:1;34004:17;:30::i;33973:94::-;34090:14;;;;34087:1833;;;11999:7;12026:6;-1:-1:-1;;;;;34142:15:0;;;12026:6;;34142:15;;;;:49;;-1:-1:-1;11999:7:0;12026:6;-1:-1:-1;;;;;34178:13:0;;;12026:6;;34178:13;;34142:49;:86;;;;-1:-1:-1;;;;;;34212:16:0;;;;34142:86;:128;;;;-1:-1:-1;;;;;;34249:21:0;;34263:6;34249:21;;34142:128;:158;;;;-1:-1:-1;34292:8:0;;;;;;;34291:9;34142:158;34120:1789;;;34338:13;;;;;;;34334:148;;-1:-1:-1;;;;;34383:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;34412:23:0;;;;;;:19;:23;;;;;;;;34383:52;34375:87;;;;-1:-1:-1;;;34375:87:0;;14240:2:1;34375:87:0;;;14222:21:1;14279:2;14259:18;;;14252:30;-1:-1:-1;;;14298:18:1;;;14291:52;14360:18;;34375:87:0;14038:346:1;34375:87:0;34640:20;;;;34636:423;;;11999:7;12026:6;-1:-1:-1;;;;;34688:13:0;;;12026:6;;34688:13;;;;:47;;;34719:15;-1:-1:-1;;;;;34705:30:0;:2;-1:-1:-1;;;;;34705:30:0;;;34688:47;:79;;;;;34753:13;-1:-1:-1;;;;;34739:28:0;:2;-1:-1:-1;;;;;34739:28:0;;;34688:79;34684:356;;;34832:9;34803:39;;;;:28;:39;;;;;;34845:12;-1:-1:-1;34795:140:0;;;;-1:-1:-1;;;34795:140:0;;14591:2:1;34795:140:0;;;14573:21:1;14630:2;14610:18;;;14603:30;14669:34;14649:18;;;14642:62;14740:34;14720:18;;;14713:62;-1:-1:-1;;;14791:19:1;;;14784:40;14841:19;;34795:140:0;14389:477:1;34795:140:0;34991:9;34962:39;;;;:28;:39;;;;;35004:12;34962:54;;34684:356;-1:-1:-1;;;;;35124:31:0;;;;;;:25;:31;;;;;;;;:71;;;;-1:-1:-1;;;;;;35160:35:0;;;;;;:31;:35;;;;;;;;35159:36;35124:71;35120:774;;;35242:20;;35232:6;:30;;35224:96;;;;-1:-1:-1;;;35224:96:0;;15073:2:1;35224:96:0;;;15055:21:1;15112:2;15092:18;;;15085:30;15151:34;15131:18;;;15124:62;-1:-1:-1;;;15202:18:1;;;15195:51;15263:19;;35224:96:0;14871:417:1;35224:96:0;35381:9;;-1:-1:-1;;;;;21226:18:0;;21199:7;21226:18;;;:9;:18;;;;;;35355:22;;:6;:22;:::i;:::-;:35;;35347:67;;;;-1:-1:-1;;;35347:67:0;;15495:2:1;35347:67:0;;;15477:21:1;15534:2;15514:18;;;15507:30;-1:-1:-1;;;15553:18:1;;;15546:49;15612:18;;35347:67:0;15293:343:1;35347:67:0;35120:774;;;-1:-1:-1;;;;;35504:29:0;;;;;;:25;:29;;;;;;;;:71;;;;-1:-1:-1;;;;;;35538:37:0;;;;;;:31;:37;;;;;;;;35537:38;35504:71;35500:394;;;35622:20;;35612:6;:30;;35604:97;;;;-1:-1:-1;;;35604:97:0;;15843:2:1;35604:97:0;;;15825:21:1;15882:2;15862:18;;;15855:30;15921:34;15901:18;;;15894:62;-1:-1:-1;;;15972:18:1;;;15965:52;16034:19;;35604:97:0;15641:418:1;35500:394:0;-1:-1:-1;;;;;35748:35:0;;;;;;:31;:35;;;;;;;;35744:150;;35841:9;;-1:-1:-1;;;;;21226:18:0;;21199:7;21226:18;;;:9;:18;;;;;;35815:22;;:6;:22;:::i;:::-;:35;;35807:67;;;;-1:-1:-1;;;35807:67:0;;15495:2:1;35807:67:0;;;15477:21:1;15534:2;15514:18;;;15507:30;-1:-1:-1;;;15553:18:1;;;15546:49;15612:18;;35807:67:0;15293:343:1;35807:67:0;35975:4;35926:28;21226:18;;;:9;:18;;;;;;35926:55;;35992:12;36031:18;;36007:20;:42;;:74;;;;36053:28;36064:4;36070:2;36074:6;36053:10;:28::i;:::-;35992:89;;36111:7;:35;;;;-1:-1:-1;36135:11:0;;;;;;;36111:35;:61;;;;-1:-1:-1;36164:8:0;;;;;;;36163:9;36111:61;:110;;;;-1:-1:-1;;;;;;36190:31:0;;;;;;:25;:31;;;;;;;;36189:32;36111:110;:153;;;;-1:-1:-1;;;;;;36239:25:0;;;;;;:19;:25;;;;;;;;36238:26;36111:153;:194;;;;-1:-1:-1;;;;;;36282:23:0;;;;;;:19;:23;;;;;;;;36281:24;36111:194;36093:338;;;36332:8;:15;;-1:-1:-1;;36332:15:0;;;;;36376:10;:8;:10::i;:::-;36403:8;:16;;-1:-1:-1;;36403:16:0;;;36093:338;36455:8;;;;;;;36454:9;:42;;;;-1:-1:-1;;;;;;36467:29:0;;;;;;:25;:29;;;;;;;;36454:42;:59;;;;-1:-1:-1;36500:13:0;;;;36454:59;:114;;;;;36553:15;;36536:14;;:32;;;;:::i;:::-;36517:15;:51;;36454:114;:144;;;;-1:-1:-1;;;;;;36573:25:0;;;;;;:19;:25;;;;;;;;36572:26;36454:144;36451:204;;;36614:29;:27;:29::i;:::-;;36451:204;36683:8;;-1:-1:-1;;;;;36792:25:0;;36667:12;36792:25;;;:19;:25;;;;;;36683:8;;;;;;;36682:9;;36792:25;;:52;;-1:-1:-1;;;;;;36821:23:0;;;;;;:19;:23;;;;;;;;36792:52;36789:99;;;-1:-1:-1;36871:5:0;36789:99;36908:12;37012:7;37009:959;;;-1:-1:-1;;;;;37060:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;37109:1;37093:13;;:17;37060:50;37056:741;;;37137:34;37167:3;37137:25;37148:13;;37137:6;:10;;:25;;;;:::i;:34::-;37130:41;;37238:13;;37219:16;;37212:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;37190:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;37306:13:0;;37293:10;;37286:17;;:4;:17;:::i;:::-;:33;;;;:::i;:::-;37270:12;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;37384:13:0;;37366:15;;37359:22;;:4;:22;:::i;:::-;:38;;;;:::i;:::-;37338:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;37056:741:0;;-1:-1:-1;37056:741:0;;-1:-1:-1;;;;;37455:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;37505:1;37490:12;;:16;37455:51;37452:345;;;37531:33;37560:3;37531:24;37542:12;;37531:6;:10;;:24;;;;:::i;:33::-;37524:40;;37627:12;;37609:15;;37602:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;37580:18;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;37693:12:0;;37681:9;;37674:16;;:4;:16;:::i;:::-;:31;;;;:::i;:::-;37658:12;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;37769:12:0;;37752:14;;37745:21;;:4;:21;:::i;:::-;:36;;;;:::i;:::-;37724:17;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;37452:345:0;37828:8;;37825:95;;37860:44;37878:4;37892;37899;37860:17;:44::i;:::-;37942:14;37952:4;37942:14;;:::i;:::-;;;37009:959;37980:35;37998:4;38004:2;38008:6;37980:17;:35::i;:::-;33797:4226;;;;33693:4330;;;:::o;7527:192::-;7613:7;7649:12;7641:6;;;;7633:29;;;;-1:-1:-1;;;7633:29:0;;;;;;;;:::i;:::-;-1:-1:-1;7673:9:0;7685:5;7689:1;7685;:5;:::i;:::-;7673:17;7527:192;-1:-1:-1;;;;;7527:192:0:o;6624:181::-;6682:7;;6714:5;6718:1;6714;:5;:::i;:::-;6702:17;;6743:1;6738;:6;;6730:46;;;;-1:-1:-1;;;6730:46:0;;16399:2:1;6730:46:0;;;16381:21:1;16438:2;16418:18;;;16411:30;16477:29;16457:18;;;16450:57;16524:18;;6730:46:0;16197:351:1;32178:188:0;-1:-1:-1;;;;;32261:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;32261:39:0;;;;;;;;;;32318:40;;32261:39;;:31;32318:40;;;32178:188;;:::o;7978:471::-;8036:7;8281:1;8286;8281:6;8277:47;;-1:-1:-1;8311:1:0;8304:8;;8277:47;8336:9;8348:5;8352:1;8348;:5;:::i;:::-;8336:17;-1:-1:-1;8381:1:0;8372:5;8376:1;8336:17;8372:5;:::i;:::-;:10;8364:56;;;;-1:-1:-1;;;8364:56:0;;16755:2:1;8364:56:0;;;16737:21:1;16794:2;16774:18;;;16767:30;16833:34;16813:18;;;16806:62;-1:-1:-1;;;16884:18:1;;;16877:31;16925:19;;8364:56:0;16553:397:1;8925:132:0;8983:7;9010:39;9014:1;9017;9010:39;;;;;;;;;;;;;;;;;:3;:39::i;22645:581::-;-1:-1:-1;;;;;22793:20:0;;22785:70;;;;-1:-1:-1;;;22785:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22874:23:0;;22866:71;;;;-1:-1:-1;;;22866:71:0;;;;;;;:::i;:::-;23030;23052:6;23030:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23030:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;23010:17:0;;;;;;;:9;:17;;;;;;:91;;;;23135:20;;;;;;;:32;;23160:6;23135:24;:32::i;:::-;-1:-1:-1;;;;;23112:20:0;;;;;;;:9;:20;;;;;;;:55;;;;23183:35;;;;;;;;;;23211:6;1987:25:1;;1975:2;1960:18;;1841:177;33313:239:0;33411:7;;33391:4;;-1:-1:-1;;;;;33411:7:0;:21;33408:105;;33462:7;;33455:46;;-1:-1:-1;;;33455:46:0;;-1:-1:-1;;;;;17213:15:1;;;33455:46:0;;;17195:34:1;17265:15;;;17245:18;;;17238:43;17297:18;;;17290:34;;;33462:7:0;;;;33455:28;;17130:18:1;;33455:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33448:53;;;;39169:1538;39252:4;39208:23;21226:18;;;:9;:18;;;;;;39208:50;;39269:25;39338:12;;39318:17;;39297:18;;:38;;;;:::i;:::-;:53;;;;:::i;:::-;39269:81;-1:-1:-1;39361:12:0;39397:20;;;:46;;-1:-1:-1;39421:22:0;;39397:46;39394:58;;;39445:7;;;39169:1538::o;39394:58::-;39485:18;;:23;;39506:2;39485:23;:::i;:::-;39467:15;:41;39464:111;;;39540:18;;:23;;39561:2;39540:23;:::i;:::-;39522:41;;39464:111;39636:23;39721:1;39701:17;39680:18;;39662:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;39636:86;-1:-1:-1;39733:26:0;39762:36;:15;39636:86;39762:19;:36::i;:::-;39733:65;-1:-1:-1;39837:21:0;39869:36;39733:65;39869:16;:36::i;:::-;39917:18;39938:44;:21;39964:17;39938:25;:44::i;:::-;39917:65;;39993:22;40018:56;40056:17;40018:33;40033:17;;40018:10;:14;;:33;;;;:::i;:56::-;39993:81;;40085:17;40105:51;40138:17;40105:28;40120:12;;40105:10;:14;;:28;;;;:::i;:51::-;40085:71;-1:-1:-1;40167:23:0;40085:71;40193:27;40206:14;40193:10;:27;:::i;:::-;:39;;;;:::i;:::-;40264:1;40243:18;:22;;;40276:17;:21;;;40308:12;:16;;;40356:9;;40348:45;;40167:65;;-1:-1:-1;;;;;;40356:9:0;;40379;;40348:45;40264:1;40348:45;40379:9;40356;40348:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40335:58:0;;-1:-1:-1;;40407:19:0;;;;;:42;;;40448:1;40430:15;:19;40407:42;40404:210;;;40465:46;40478:15;40495;40465:12;:46::i;:::-;40583:18;;40531:71;;;17997:25:1;;;18053:2;18038:18;;18031:34;;;18081:18;;;18074:34;;;;40531:71:0;;;;;;17985:2:1;40531:71:0;;;40404:210;40645:14;;40637:62;;-1:-1:-1;;;;;40645:14:0;;;;40673:21;;40637:62;;;;40673:21;40645:14;40637:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;39169:1538:0:o;41174:796::-;41264:15;41247:14;:32;41373:29;;-1:-1:-1;;;41373:29:0;;-1:-1:-1;;;;;41388:13:0;1797:32:1;41373:29:0;;;1779:51:1;41231:4:0;;;;41373;;:14;;1752:18:1;;41373:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41342:60;;41460:20;41483:53;41530:5;41483:42;41508:16;;41483:20;:24;;:42;;;;:::i;:53::-;41460:76;-1:-1:-1;41649:16:0;;41645:111;;41681:63;41699:13;41722:6;41731:12;41681:17;:63::i;:::-;41839:19;41876:13;41839:51;;41901:4;-1:-1:-1;;;;;41901:9:0;;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41928:12:0;;;;-1:-1:-1;41928:12:0;;-1:-1:-1;41928:12:0;41958:4;41951:11;;;;;41174:796;:::o;9553:278::-;9639:7;9674:12;9667:5;9659:28;;;;-1:-1:-1;;;9659:28:0;;;;;;;;:::i;:::-;-1:-1:-1;9698:9:0;9710:5;9714:1;9710;:5;:::i;7088:136::-;7146:7;7173:43;7177:1;7180;7173:43;;;;;;;;;;;;;;;;;:3;:43::i;38031:601::-;38183:16;;;38197:1;38183:16;;;;;;;;38159:21;;38183:16;;;;;;;;;;-1:-1:-1;38183:16:0;38159:40;;38228:4;38210;38215:1;38210:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;38210:23:0;;;-1:-1:-1;;;;;38210:23:0;;;;;38254:15;-1:-1:-1;;;;;38254:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38244:4;38249:1;38244:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;38244:32:0;;;-1:-1:-1;;;;;38244:32:0;;;;;38289:62;38306:4;38321:15;38339:11;38289:8;:62::i;:::-;38390:224;;-1:-1:-1;;;38390:224:0;;-1:-1:-1;;;;;38390:15:0;:66;;;;:224;;38471:11;;38497:1;;38541:4;;38568;;38588:15;;38390:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38086:546;38031:601;:::o;38644:517::-;38792:62;38809:4;38824:15;38842:11;38792:8;:62::i;:::-;38897:256;;-1:-1:-1;;;38897:256:0;;38969:4;38897:256;;;19833:34:1;19883:18;;;19876:34;;;39015:1:0;19926:18:1;;;19919:34;;;19969:18;;;19962:34;25276:6:0;20012:19:1;;;20005:44;39127:15:0;20065:19:1;;;20058:35;38897:15:0;-1:-1:-1;;;;;38897:31:0;;;;38936:9;;19767:19:1;;38897:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;38644:517;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;622:70;567:131;:::o;703:134::-;771:20;;800:31;771:20;800:31;:::i;842:315::-;910:6;918;971:2;959:9;950:7;946:23;942:32;939:52;;;987:1;984;977:12;939:52;1026:9;1013:23;1045:31;1070:5;1045:31;:::i;:::-;1095:5;1147:2;1132:18;;;;1119:32;;-1:-1:-1;;;842:315:1:o;1354:247::-;1413:6;1466:2;1454:9;1445:7;1441:23;1437:32;1434:52;;;1482:1;1479;1472:12;1434:52;1521:9;1508:23;1540:31;1565:5;1540:31;:::i;2023:180::-;2082:6;2135:2;2123:9;2114:7;2110:23;2106:32;2103:52;;;2151:1;2148;2141:12;2103:52;-1:-1:-1;2174:23:1;;2023:180;-1:-1:-1;2023:180:1:o;2208:456::-;2285:6;2293;2301;2354:2;2342:9;2333:7;2329:23;2325:32;2322:52;;;2370:1;2367;2360:12;2322:52;2409:9;2396:23;2428:31;2453:5;2428:31;:::i;:::-;2478:5;-1:-1:-1;2535:2:1;2520:18;;2507:32;2548:33;2507:32;2548:33;:::i;:::-;2208:456;;2600:7;;-1:-1:-1;;;2654:2:1;2639:18;;;;2626:32;;2208:456::o;3198:118::-;3284:5;3277:13;3270:21;3263:5;3260:32;3250:60;;3306:1;3303;3296:12;3321:956;3412:6;3465:3;3453:9;3444:7;3440:23;3436:33;3433:53;;;3482:1;3479;3472:12;3433:53;3515:2;3509:9;3557:3;3549:6;3545:16;3627:6;3615:10;3612:22;3591:18;3579:10;3576:34;3573:62;3570:185;;;3677:10;3672:3;3668:20;3665:1;3658:31;3712:4;3709:1;3702:15;3740:4;3737:1;3730:15;3570:185;3771:2;3764:22;3808:23;;3840:28;3808:23;3840:28;:::i;:::-;3877:21;;3950:2;3935:18;;3922:32;3963:30;3922:32;3963:30;:::i;:::-;4021:2;4009:15;;4002:32;4067:38;4101:2;4086:18;;4067:38;:::i;:::-;4062:2;4054:6;4050:15;4043:63;4139:38;4173:2;4162:9;4158:18;4139:38;:::i;:::-;4134:2;4126:6;4122:15;4115:63;4240:3;4229:9;4225:19;4212:33;4206:3;4198:6;4194:16;4187:59;4265:6;4255:16;;;3321:956;;;;:::o;4282:377::-;4356:6;4364;4372;4425:2;4413:9;4404:7;4400:23;4396:32;4393:52;;;4441:1;4438;4431:12;4393:52;4477:9;4464:23;4454:33;;4534:2;4523:9;4519:18;4506:32;4496:42;;4588:2;4577:9;4573:18;4560:32;4601:28;4623:5;4601:28;:::i;:::-;4648:5;4638:15;;;4282:377;;;;;:::o;4664:382::-;4729:6;4737;4790:2;4778:9;4769:7;4765:23;4761:32;4758:52;;;4806:1;4803;4796:12;4758:52;4845:9;4832:23;4864:31;4889:5;4864:31;:::i;:::-;4914:5;-1:-1:-1;4971:2:1;4956:18;;4943:32;4984:30;4943:32;4984:30;:::i;:::-;5033:7;5023:17;;;4664:382;;;;;:::o;5051:316::-;5128:6;5136;5144;5197:2;5185:9;5176:7;5172:23;5168:32;5165:52;;;5213:1;5210;5203:12;5165:52;-1:-1:-1;;5236:23:1;;;5306:2;5291:18;;5278:32;;-1:-1:-1;5357:2:1;5342:18;;;5329:32;;5051:316;-1:-1:-1;5051:316:1:o;5372:241::-;5428:6;5481:2;5469:9;5460:7;5456:23;5452:32;5449:52;;;5497:1;5494;5487:12;5449:52;5536:9;5523:23;5555:28;5577:5;5555:28;:::i;5618:388::-;5686:6;5694;5747:2;5735:9;5726:7;5722:23;5718:32;5715:52;;;5763:1;5760;5753:12;5715:52;5802:9;5789:23;5821:31;5846:5;5821:31;:::i;:::-;5871:5;-1:-1:-1;5928:2:1;5913:18;;5900:32;5941:33;5900:32;5941:33;:::i;6011:380::-;6090:1;6086:12;;;;6133;;;6154:61;;6208:4;6200:6;6196:17;6186:27;;6154:61;6261:2;6253:6;6250:14;6230:18;6227:38;6224:161;;6307:10;6302:3;6298:20;6295:1;6288:31;6342:4;6339:1;6332:15;6370:4;6367:1;6360:15;6224:161;;6011:380;;;:::o;6396:356::-;6598:2;6580:21;;;6617:18;;;6610:30;6676:34;6671:2;6656:18;;6649:62;6743:2;6728:18;;6396:356::o;6757:127::-;6818:10;6813:3;6809:20;6806:1;6799:31;6849:4;6846:1;6839:15;6873:4;6870:1;6863:15;6889:168;6962:9;;;6993;;7010:15;;;7004:22;;6990:37;6980:71;;7031:18;;:::i;7062:217::-;7102:1;7128;7118:132;;7172:10;7167:3;7163:20;7160:1;7153:31;7207:4;7204:1;7197:15;7235:4;7232:1;7225:15;7118:132;-1:-1:-1;7264:9:1;;7062:217::o;8537:125::-;8602:9;;;8623:10;;;8620:36;;;8636:18;;:::i;12231:184::-;12301:6;12354:2;12342:9;12333:7;12329:23;12325:32;12322:52;;;12370:1;12367;12360:12;12322:52;-1:-1:-1;12393:16:1;;12231:184;-1:-1:-1;12231:184:1:o;13228:401::-;13430:2;13412:21;;;13469:2;13449:18;;;13442:30;13508:34;13503:2;13488:18;;13481:62;-1:-1:-1;;;13574:2:1;13559:18;;13552:35;13619:3;13604:19;;13228:401::o;13634:399::-;13836:2;13818:21;;;13875:2;13855:18;;;13848:30;13914:34;13909:2;13894:18;;13887:62;-1:-1:-1;;;13980:2:1;13965:18;;13958:33;14023:3;14008:19;;13634:399::o;16064:128::-;16131:9;;;16152:11;;;16149:37;;;16166:18;;:::i;17335:245::-;17402:6;17455:2;17443:9;17434:7;17430:23;17426:32;17423:52;;;17471:1;17468;17461:12;17423:52;17503:9;17497:16;17522:28;17544:5;17522:28;:::i;18119:127::-;18180:10;18175:3;18171:20;18168:1;18161:31;18211:4;18208:1;18201:15;18235:4;18232:1;18225:15;18251:251;18321:6;18374:2;18362:9;18353:7;18349:23;18345:32;18342:52;;;18390:1;18387;18380:12;18342:52;18422:9;18416:16;18441:31;18466:5;18441:31;:::i;18507:980::-;18769:4;18817:3;18806:9;18802:19;18848:6;18837:9;18830:25;18874:2;18912:6;18907:2;18896:9;18892:18;18885:34;18955:3;18950:2;18939:9;18935:18;18928:31;18979:6;19014;19008:13;19045:6;19037;19030:22;19083:3;19072:9;19068:19;19061:26;;19122:2;19114:6;19110:15;19096:29;;19143:1;19153:195;19167:6;19164:1;19161:13;19153:195;;;19232:13;;-1:-1:-1;;;;;19228:39:1;19216:52;;19323:15;;;;19288:12;;;;19264:1;19182:9;19153:195;;;-1:-1:-1;;;;;;;19404:32:1;;;;19399:2;19384:18;;19377:60;-1:-1:-1;;;19468:3:1;19453:19;19446:35;19365:3;18507:980;-1:-1:-1;;;18507:980:1:o;20104:306::-;20192:6;20200;20208;20261:2;20249:9;20240:7;20236:23;20232:32;20229:52;;;20277:1;20274;20267:12;20229:52;20306:9;20300:16;20290:26;;20356:2;20345:9;20341:18;20335:25;20325:35;;20400:2;20389:9;20385:18;20379:25;20369:35;;20104:306;;;;;:::o
Swarm Source
ipfs://1a31b1047cc3ac156a9ec2a8b4733ddbc30f58893ad0c751c9550aabbef7e8f2
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.