ERC-20
Overview
Max Total Supply
1,000,000,000 RIFF
Holders
12
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
13,429,999.21 RIFFValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Riffusion
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-18 */ /** * .__ _____ _____ .__ *_______|__|/ ____\/ ____\_ __ _____|__| ____ ____ *\_ __ \ \ __\\ __\ | \/ ___/ |/ _ \ / \ * | | \/ || | | | | | /\___ \| ( <_> ) | \ * |__| |__||__| |__| |____//____ >__|\____/|___| / * \/ \/ * * Music Generation AI : Powered by Stable Diffusion * * Telegram: https://t.me/riffusion * Website: https://www.riffusion.com/ * * Total Supply: 1 Billion Tokens * Unlock & Add our AI Bot to your Telegram channel! * * Set slippage to 3-4% : 1% to LP, 2% tax for Marketing & GPU Hosting costs. */ // SPDX-License-Identifier: MIT pragma solidity 0.8.16; interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function allPairsLength() external view returns (uint256); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 ); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); } /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() external view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the name of the token. */ function name() external view virtual override returns (string memory) { return _name; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 9; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() external view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) external virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) external virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) external virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) external virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) external virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** @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"); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += 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. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require( currentAllowance >= amount, "ERC20: insufficient allowance" ); unchecked { _approve(owner, spender, currentAllowance - amount); } } } function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); uint256 fromBalance = _balances[from]; require( fromBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); } } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract Riffusion is ERC20, Ownable { // TOKENOMICS START ==========================================================> string private _name = "Riffusion"; string private _symbol = "RIFF"; uint8 private _decimals = 9; uint256 private _supply = 1000000000; uint256 public taxForLiquidity = 45; //sniper protection, lowered to 1% after launch uint256 public taxForMarketing = 47; //sniper protection, lowered to 2% after launch uint256 public maxTxAmount = 17000001 * 10**_decimals; uint256 public maxWalletAmount = 17000001 * 10**_decimals; address public marketingWallet = 0x2f0395439Fa7c2232aBbD63865661483B7909C0B; address public DEAD = 0x000000000000000000000000000000000000dEaD; uint256 public _marketingReserves = 0; mapping(address => bool) public _isExcludedFromFee; uint256 public numTokensSellToAddToLiquidity = 300000 * 10**_decimals; uint256 public numTokensSellToAddToETH = 800000 * 10**_decimals; function postLaunch() external onlyOwner { taxForLiquidity = 1; taxForMarketing = 2; maxTxAmount = 17000001 * 10**_decimals; maxWalletAmount = 17000001 * 10**_decimals; } function Launch() external onlyOwner { require(taxForMarketing > 40, "One time use only"); taxForLiquidity = 2; taxForMarketing = 19; maxTxAmount = 17000001 * 10**_decimals; maxWalletAmount = 17000001 * 10**_decimals; } // TOKENOMICS END ============================================================> // StableDiffusion Access START ==============================================> struct userUnlock { string tgUserName; bool unlocked; uint256 unlockedAt; uint256 totalEthPaid; } struct channelUnlock { string tgChannel; bool unlocked; uint256 unlockedAt; uint256 totalEthPaid; } mapping(string => userUnlock) public unlockedUsers; mapping(string => channelUnlock) public unlockedChannels; uint public userCostEth = 0.03 ether; uint public userCostTokens = 10000 * 10**_decimals; uint public channelCostEth = 0.15 ether; uint public channelCostTokens = 100000 * 10**_decimals; event UserUnlocked(string tg_username, uint256 unlockTime); event ChannelUnlocked(string tg_channel, uint256 unlockTime); event CostUpdated(bool _isEth, bool _isChannel, uint _cost); event ExcludedFromFeeUpdated(address _address, bool _status); event AdminModifierSet(string tg_user_chan, bool _isChannel, bool _isUnlocked, uint _unlockBlock, uint _amtPaid); event PairUpdated(address _address); //with all eth payments, reserve is held on the contract until the sending threshold is reached. function unlockUser(string memory tg_username) external payable { require(msg.value >= userCostEth, "Not enough ETH sent!"); require(msg.sender.balance >= userCostTokens, "Not enough tokens!"); _marketingReserves += msg.value; _transfer(msg.sender, DEAD, userCostTokens); unlockedUsers[tg_username] = userUnlock( tg_username, true, block.timestamp, unlockedUsers[tg_username].totalEthPaid + msg.value ); emit UserUnlocked(tg_username, block.timestamp); } function unlockChannel(string memory tg_channel) external payable { require(msg.value >= userCostEth, "Not enough ETH sent!"); require(msg.sender.balance >= userCostTokens, "Not enough tokens!"); _marketingReserves += msg.value; _transfer(msg.sender, DEAD, userCostTokens); unlockedChannels[tg_channel] = channelUnlock( tg_channel, true, block.timestamp, unlockedChannels[tg_channel].totalEthPaid + msg.value ); emit ChannelUnlocked(tg_channel, block.timestamp); } //Some simple ABIv1 getters below function isUnlocked(string memory tg_user_chan, bool _isChannel) external view returns(bool) { if (_isChannel) { return unlockedChannels[tg_user_chan].unlocked; } return unlockedUsers[tg_user_chan].unlocked; } function getAmtPaid(string memory tg_user_chan, bool _isChannel) external view returns(uint) { if (_isChannel) { return unlockedChannels[tg_user_chan].totalEthPaid; } return unlockedUsers[tg_user_chan].totalEthPaid; } function getUnlockBlock(string memory tg_user_chan, bool _isChannel) external view returns(uint) { if (_isChannel) { return unlockedChannels[tg_user_chan].unlockedAt; } return unlockedUsers[tg_user_chan].unlockedAt; } //Admin modifier function function setUnlockStatus(string memory tg_user_chan, bool _isChannel, bool _isUnlocked, uint _unlockBlock, uint _amtPaid) external onlyOwner { if (_isChannel) { unlockedChannels[tg_user_chan] = channelUnlock( tg_user_chan, _isUnlocked, _unlockBlock, _amtPaid ); } else { unlockedUsers[tg_user_chan] = userUnlock( tg_user_chan, _isUnlocked, _unlockBlock, _amtPaid ); } emit AdminModifierSet(tg_user_chan, _isChannel, _isUnlocked, _unlockBlock, _amtPaid); } function setCost(bool _isEth, bool _isChannel, uint _cost) external onlyOwner { if (_isEth) { if (_isChannel) { channelCostEth = _cost; } else { userCostEth = _cost; } } else { if (_isChannel) { channelCostTokens = _cost * 10**_decimals; } else { userCostTokens = _cost * 10**_decimals; } } emit CostUpdated(_isEth, _isChannel, _cost); } // StableDiffusion Access END ================================================> IUniswapV2Router02 public immutable uniswapV2Router; address public uniswapV2Pair; bool inSwapAndLiquify; event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); modifier lockTheSwap() { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor() ERC20(_name, _symbol) { _mint(msg.sender, (_supply * 10**_decimals)); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //eth mainnet uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; _isExcludedFromFee[address(uniswapV2Router)] = true; _isExcludedFromFee[msg.sender] = true; _isExcludedFromFee[marketingWallet] = true; } function updatePair(address _pair) external onlyOwner { require(_pair != DEAD, "LP Pair cannot be the Dead wallet, or 0!"); require(_pair != address(0), "LP Pair cannot be the Dead wallet, or 0!"); uniswapV2Pair = _pair; emit PairUpdated(_pair); } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(balanceOf(from) >= amount, "ERC20: transfer amount exceeds balance"); if ((from == uniswapV2Pair || to == uniswapV2Pair) && !inSwapAndLiquify) { if (from != uniswapV2Pair) { uint256 contractLiquidityBalance = balanceOf(address(this)) - _marketingReserves; if (contractLiquidityBalance >= numTokensSellToAddToLiquidity) { _swapAndLiquify(numTokensSellToAddToLiquidity); } if ((_marketingReserves) >= numTokensSellToAddToETH) { _swapTokensForEth(numTokensSellToAddToETH); _marketingReserves -= numTokensSellToAddToETH; bool sent = payable(marketingWallet).send(address(this).balance); require(sent, "Failed to send ETH"); } } uint256 transferAmount; if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) { transferAmount = amount; } else { require(amount <= maxTxAmount, "ERC20: transfer amount exceeds the max transaction amount"); if(from == uniswapV2Pair){ require((amount + balanceOf(to)) <= maxWalletAmount, "ERC20: balance amount exceeded max wallet amount limit"); } uint256 marketingShare = ((amount * taxForMarketing) / 100); uint256 liquidityShare = ((amount * taxForLiquidity) / 100); transferAmount = amount - (marketingShare + liquidityShare); _marketingReserves += marketingShare; super._transfer(from, address(this), (marketingShare + liquidityShare)); } super._transfer(from, to, transferAmount); } else { super._transfer(from, to, amount); } } function excludeFromFee(address _address, bool _status) external onlyOwner { _isExcludedFromFee[_address] = _status; emit ExcludedFromFeeUpdated(_address, _status); } function _swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap { uint256 half = (contractTokenBalance / 2); uint256 otherHalf = (contractTokenBalance - half); uint256 initialBalance = address(this).balance; _swapTokensForEth(half); uint256 newBalance = (address(this).balance - initialBalance); _addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } function _swapTokensForEth(uint256 tokenAmount) private lockTheSwap { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private lockTheSwap { _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, 0, marketingWallet, block.timestamp ); } function changeMarketingWallet(address newWallet) public onlyOwner returns (bool) { require(newWallet != DEAD, "LP Pair cannot be the Dead wallet, or 0!"); require(newWallet != address(0), "LP Pair cannot be the Dead wallet, or 0!"); marketingWallet = newWallet; return true; } function changeTaxForLiquidityAndMarketing(uint256 _taxForLiquidity, uint256 _taxForMarketing) public onlyOwner returns (bool) { require((_taxForLiquidity+_taxForMarketing) <= 10, "ERC20: total tax must not be greater than 10%"); taxForLiquidity = _taxForLiquidity; taxForMarketing = _taxForMarketing; return true; } function changeSwapThresholds(uint256 _numTokensSellToAddToLiquidity, uint256 _numTokensSellToAddToETH) public onlyOwner returns (bool) { require(_numTokensSellToAddToLiquidity < _supply / 98, "Cannot liquidate more than 2% of the supply at once!"); require(_numTokensSellToAddToETH < _supply / 98, "Cannot liquidate more than 2% of the supply at once!"); numTokensSellToAddToLiquidity = _numTokensSellToAddToLiquidity * 10**_decimals; numTokensSellToAddToETH = _numTokensSellToAddToETH * 10**_decimals; return true; } receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tg_user_chan","type":"string"},{"indexed":false,"internalType":"bool","name":"_isChannel","type":"bool"},{"indexed":false,"internalType":"bool","name":"_isUnlocked","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_unlockBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amtPaid","type":"uint256"}],"name":"AdminModifierSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tg_channel","type":"string"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"ChannelUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_isEth","type":"bool"},{"indexed":false,"internalType":"bool","name":"_isChannel","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"CostUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"bool","name":"_status","type":"bool"}],"name":"ExcludedFromFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"PairUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tg_username","type":"string"},{"indexed":false,"internalType":"uint256","name":"unlockTime","type":"uint256"}],"name":"UserUnlocked","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"changeMarketingWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokensSellToAddToLiquidity","type":"uint256"},{"internalType":"uint256","name":"_numTokensSellToAddToETH","type":"uint256"}],"name":"changeSwapThresholds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxForLiquidity","type":"uint256"},{"internalType":"uint256","name":"_taxForMarketing","type":"uint256"}],"name":"changeTaxForLiquidityAndMarketing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"channelCostEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"channelCostTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tg_user_chan","type":"string"},{"internalType":"bool","name":"_isChannel","type":"bool"}],"name":"getAmtPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"tg_user_chan","type":"string"},{"internalType":"bool","name":"_isChannel","type":"bool"}],"name":"getUnlockBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tg_user_chan","type":"string"},{"internalType":"bool","name":"_isChannel","type":"bool"}],"name":"isUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"postLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isEth","type":"bool"},{"internalType":"bool","name":"_isChannel","type":"bool"},{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tg_user_chan","type":"string"},{"internalType":"bool","name":"_isChannel","type":"bool"},{"internalType":"bool","name":"_isUnlocked","type":"bool"},{"internalType":"uint256","name":"_unlockBlock","type":"uint256"},{"internalType":"uint256","name":"_amtPaid","type":"uint256"}],"name":"setUnlockStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxForMarketing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"string","name":"tg_channel","type":"string"}],"name":"unlockChannel","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"tg_username","type":"string"}],"name":"unlockUser","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"unlockedChannels","outputs":[{"internalType":"string","name":"tgChannel","type":"string"},{"internalType":"bool","name":"unlocked","type":"bool"},{"internalType":"uint256","name":"unlockedAt","type":"uint256"},{"internalType":"uint256","name":"totalEthPaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"unlockedUsers","outputs":[{"internalType":"string","name":"tgUserName","type":"string"},{"internalType":"bool","name":"unlocked","type":"bool"},{"internalType":"uint256","name":"unlockedAt","type":"uint256"},{"internalType":"uint256","name":"totalEthPaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"}],"name":"updatePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userCostEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userCostTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e0604052600960a0908152682934b3333ab9b4b7b760b91b60c0526006906200002a9082620006d3565b506040805180820190915260048152632924a32360e11b6020820152600790620000559082620006d3565b506008805460ff19166009908117909155633b9aca008155602d600a908155602f600b55620000859190620008b4565b62000095906301036641620008cc565b600c55600854620000ab9060ff16600a620008b4565b620000bb906301036641620008cc565b600d55600e80546001600160a01b0319908116732f0395439fa7c2232abbd63865661483b7909c0b17909155600f805490911661dead17905560006010556008546200010c9060ff16600a620008b4565b6200011b90620493e0620008cc565b601255600854620001319060ff16600a620008b4565b6200014090620c3500620008cc565b601355666a94d74f430000601655600854620001619060ff16600a620008b4565b6200016f90612710620008cc565b601755670214e8348c4f0000601855600854620001919060ff16600a620008b4565b620001a090620186a0620008cc565b601955348015620001b057600080fd5b5060068054620001c09062000644565b80601f0160208091040260200160405190810160405280929190818152602001828054620001ee9062000644565b80156200023f5780601f1062000213576101008083540402835291602001916200023f565b820191906000526020600020905b8154815290600101906020018083116200022157829003601f168201915b505050505060078054620002539062000644565b80601f0160208091040260200160405190810160405280929190818152602001828054620002819062000644565b8015620002d25780601f10620002a657610100808354040283529160200191620002d2565b820191906000526020600020905b815481529060010190602001808311620002b457829003601f168201915b50505050508160039081620002e89190620006d3565b506004620002f78282620006d3565b505050620003146200030e6200051260201b60201c565b62000516565b600854620003439033906200032e9060ff16600a620008b4565b6009546200033d9190620008cc565b62000568565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200039b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c19190620008ee565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200040f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004359190620008ee565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000483573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a99190620008ee565b601a80546001600160a01b0319166001600160a01b039283161790559081166080819052600090815260116020526040808220805460ff1990811660019081179092553384528284208054821683179055600e549094168352912080549092161790556200092f565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620005c35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060026000828254620005d7919062000919565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200065957607f821691505b6020821081036200067a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006ce57600081815260208120601f850160051c81016020861015620006a95750805b601f850160051c820191505b81811015620006ca57828155600101620006b5565b5050505b505050565b81516001600160401b03811115620006ef57620006ef6200062e565b620007078162000700845462000644565b8462000680565b602080601f8311600181146200073f5760008415620007265750858301515b600019600386901b1c1916600185901b178555620006ca565b600085815260208120601f198616915b8281101562000770578886015182559484019460019091019084016200074f565b50858210156200078f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007f6578160001904821115620007da57620007da6200079f565b80851615620007e857918102915b93841c9390800290620007ba565b509250929050565b6000826200080f57506001620008ae565b816200081e57506000620008ae565b8160018114620008375760028114620008425762000862565b6001915050620008ae565b60ff8411156200085657620008566200079f565b50506001821b620008ae565b5060208310610133831016604e8410600b841016171562000887575081810a620008ae565b620008938383620007b5565b8060001904821115620008aa57620008aa6200079f565b0290505b92915050565b6000620008c560ff841683620007fe565b9392505050565b6000816000190483118215151615620008e957620008e96200079f565b500290565b6000602082840312156200090157600080fd5b81516001600160a01b0381168114620008c557600080fd5b80820180821115620008ae57620008ae6200079f565b6080516129116200096e6000396000818161037c01528181611c6101528181611d1a01528181611d5601528181611edc0152611f4401526129116000f3fe6080604052600436106102815760003560e01c8063768dc7101161014f578063af8af690116100c1578063df1d099e1161007a578063df1d099e1461076f578063df8408fe14610785578063f1b2b3d9146107a5578063f2fde38b146107c5578063f345bd85146107e5578063fbee93ba146107fb57600080fd5b8063af8af690146106c3578063b5c78e8a146106e3578063bb85c6d114610703578063c0fdea5714610723578063d12a768814610739578063dd62ed3e1461074f57600080fd5b8063a2330d9711610113578063a2330d9714610622578063a3996f7b14610642578063a457c2d714610657578063a9059cbb14610677578063aa4bde2814610697578063ad16a0cf146106ad57600080fd5b8063768dc710146105935780637930ef69146105c35780638c0b5e22146105d95780638da5cb5b146105ef57806395d89b411461060d57600080fd5b806323b872dd116101f3578063527ffabd116101ac578063527ffabd146104c257806363cdf60f146104d857806370a0823114610508578063715018a61461053e57806373c503b31461055357806375f0a8741461057357600080fd5b806323b872dd1461040657806330b63d8014610426578063313ce56714610446578063395093511461046257806349bd5a5e146104825780634fa74c4d146104a257600080fd5b80630f1d7ad9116102455780630f1d7ad9146103575780631694505e1461036a57806316a7b1601461039e57806318160ddd146103b157806318bc47f6146103c65780631b56bbf9146103e657600080fd5b806302ac81681461028d57806303fd2a45146102a4578063054dee0f146102e157806306fdde0314610305578063095ea7b31461032757600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102a2610811565b005b3480156102b057600080fd5b50600f546102c4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102ed57600080fd5b506102f760165481565b6040519081526020016102d8565b34801561031157600080fd5b5061031a6108b7565b6040516102d89190612019565b34801561033357600080fd5b50610347610342366004612048565b610949565b60405190151581526020016102d8565b6102a2610365366004612117565b610963565b34801561037657600080fd5b506102c47f000000000000000000000000000000000000000000000000000000000000000081565b6102a26103ac366004612117565b610b10565b3480156103bd57600080fd5b506002546102f7565b3480156103d257600080fd5b506102a26103e1366004612164565b610cb2565b3480156103f257600080fd5b506102a26104013660046121d4565b610e0a565b34801561041257600080fd5b506103476104213660046121f1565b610eb4565b34801561043257600080fd5b50610347610441366004612232565b610ed8565b34801561045257600080fd5b50604051600981526020016102d8565b34801561046e57600080fd5b5061034761047d366004612048565b610f81565b34801561048e57600080fd5b50601a546102c4906001600160a01b031681565b3480156104ae57600080fd5b506103476104bd366004612254565b610fa3565b3480156104ce57600080fd5b506102f7600b5481565b3480156104e457600080fd5b506104f86104f3366004612117565b611006565b6040516102d894939291906122a2565b34801561051457600080fd5b506102f76105233660046121d4565b6001600160a01b031660009081526020819052604090205490565b34801561054a57600080fd5b506102a26110c7565b34801561055f57600080fd5b506102a261056e3660046122d1565b6110db565b34801561057f57600080fd5b50600e546102c4906001600160a01b031681565b34801561059f57600080fd5b506103476105ae3660046121d4565b60116020526000908152604090205460ff1681565b3480156105cf57600080fd5b506102f760185481565b3480156105e557600080fd5b506102f7600c5481565b3480156105fb57600080fd5b506005546001600160a01b03166102c4565b34801561061957600080fd5b5061031a611194565b34801561062e57600080fd5b506104f861063d366004612117565b6111a3565b34801561064e57600080fd5b506102a26111c9565b34801561066357600080fd5b50610347610672366004612048565b6111ef565b34801561068357600080fd5b50610347610692366004612048565b61126a565b3480156106a357600080fd5b506102f7600d5481565b3480156106b957600080fd5b506102f760135481565b3480156106cf57600080fd5b506103476106de366004612232565b611278565b3480156106ef57600080fd5b506102f76106fe366004612254565b611301565b34801561070f57600080fd5b5061034761071e3660046121d4565b61135c565b34801561072f57600080fd5b506102f760105481565b34801561074557600080fd5b506102f760125481565b34801561075b57600080fd5b506102f761076a36600461230d565b6113de565b34801561077b57600080fd5b506102f760195481565b34801561079157600080fd5b506102a26107a0366004612346565b611409565b3480156107b157600080fd5b506102f76107c0366004612254565b611474565b3480156107d157600080fd5b506102a26107e03660046121d4565b6114cf565b3480156107f157600080fd5b506102f7600a5481565b34801561080757600080fd5b506102f760175481565b610819611548565b6028600b54116108645760405162461bcd60e51b81526020600482015260116024820152704f6e652074696d6520757365206f6e6c7960781b60448201526064015b60405180910390fd5b6002600a9081556013600b556008546108829160ff9091169061246c565b61089090630103664161247b565b600c556008546108a49060ff16600a61246c565b6108b290630103664161247b565b600d55565b6060600380546108c69061249a565b80601f01602080910402602001604051908101604052809291908181526020018280546108f29061249a565b801561093f5780601f106109145761010080835404028352916020019161093f565b820191906000526020600020905b81548152906001019060200180831161092257829003601f168201915b5050505050905090565b6000336109578185856115a2565b60019150505b92915050565b6016543410156109ac5760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b604482015260640161085b565b601754333110156109f45760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b604482015260640161085b565b3460106000828254610a0691906124d4565b9091555050600f54601754610a289133916001600160a01b03909116906116c6565b604051806080016040528082815260200160011515815260200142815260200134601584604051610a5991906124e7565b908152602001604051809103902060030154610a7591906124d4565b815250601582604051610a8891906124e7565b90815260405190819003602001902081518190610aa59082612551565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f11512290610b059083904290612611565b60405180910390a150565b601654341015610b595760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b604482015260640161085b565b60175433311015610ba15760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b604482015260640161085b565b3460106000828254610bb391906124d4565b9091555050600f54601754610bd59133916001600160a01b03909116906116c6565b604051806080016040528082815260200160011515815260200142815260200134601484604051610c0691906124e7565b908152602001604051809103902060030154610c2291906124d4565b815250601482604051610c3591906124e7565b90815260405190819003602001902081518190610c529082612551565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c50890610b059083904290612611565b610cba611548565b8315610d44576040518060800160405280868152602001841515815260200183815260200182815250601586604051610cf391906124e7565b90815260405190819003602001902081518190610d109082612551565b50602082015160018201805460ff191691151591909117905560408201516002820155606090910151600390910155610dc4565b6040518060800160405280868152602001841515815260200183815260200182815250601486604051610d7791906124e7565b90815260405190819003602001902081518190610d949082612551565b50602082015160018201805460ff1916911515919091179055604082015160028201556060909101516003909101555b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf8585858585604051610dfb959493929190612633565b60405180910390a15050505050565b610e12611548565b600f546001600160a01b0390811690821603610e405760405162461bcd60e51b815260040161085b9061266a565b6001600160a01b038116610e665760405162461bcd60e51b815260040161085b9061266a565b601a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f90602001610b05565b600033610ec2858285611a8a565b610ecd8585856116c6565b506001949350505050565b6000610ee2611548565b6062600954610ef191906126b2565b8310610f0f5760405162461bcd60e51b815260040161085b906126d4565b6062600954610f1e91906126b2565b8210610f3c5760405162461bcd60e51b815260040161085b906126d4565b600854610f4d9060ff16600a61246c565b610f57908461247b565b601255600854610f6b9060ff16600a61246c565b610f75908361247b565b60135550600192915050565b600033610957818585610f9483836113de565b610f9e91906124d4565b6115a2565b60008115610fd857601583604051610fbb91906124e7565b9081526040519081900360200190206001015460ff16905061095d565b601483604051610fe891906124e7565b9081526040519081900360200190206001015460ff16905092915050565b805160208183018101805160148252928201919093012091528054819061102c9061249a565b80601f01602080910402602001604051908101604052809291908181526020018280546110589061249a565b80156110a55780601f1061107a576101008083540402835291602001916110a5565b820191906000526020600020905b81548152906001019060200180831161108857829003601f168201915b5050505060018301546002840154600390940154929360ff9091169290915084565b6110cf611548565b6110d96000611afe565b565b6110e3611548565b82156111035781156110f957601881905561114b565b601681905561114b565b811561112c5760085461111a9060ff16600a61246c565b611124908261247b565b60195561114b565b60085461113d9060ff16600a61246c565b611147908261247b565b6017555b60408051841515815283151560208201529081018290527fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda29060600160405180910390a1505050565b6060600480546108c69061249a565b805160208183018101805160158252928201919093012091528054819061102c9061249a565b6111d1611548565b6001600a9081556002600b556008546108829160ff9091169061246c565b600033816111fd82866113de565b90508381101561125d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161085b565b610ecd82868684036115a2565b6000336109578185856116c6565b6000611282611548565b600a61128e83856124d4565b11156112f25760405162461bcd60e51b815260206004820152602d60248201527f45524332303a20746f74616c20746178206d757374206e6f742062652067726560448201526c61746572207468616e2031302560981b606482015260840161085b565b50600a91909155600b55600190565b600081156113325760158360405161131991906124e7565b908152602001604051809103902060030154905061095d565b60148360405161134291906124e7565b908152602001604051809103902060030154905092915050565b6000611366611548565b600f546001600160a01b03908116908316036113945760405162461bcd60e51b815260040161085b9061266a565b6001600160a01b0382166113ba5760405162461bcd60e51b815260040161085b9061266a565b50600e80546001600160a01b0319166001600160a01b03831617905560015b919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611411611548565b6001600160a01b038216600081815260116020908152604091829020805460ff19168515159081179091558251938452908301527f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff2910160405180910390a15050565b600081156114a55760158360405161148c91906124e7565b908152602001604051809103902060020154905061095d565b6014836040516114b591906124e7565b908152602001604051809103902060020154905092915050565b6114d7611548565b6001600160a01b03811661153c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161085b565b61154581611afe565b50565b6005546001600160a01b031633146110d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161085b565b6001600160a01b0383166116045760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161085b565b6001600160a01b0382166116655760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161085b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116ec5760405162461bcd60e51b815260040161085b90612728565b6001600160a01b0382166117125760405162461bcd60e51b815260040161085b9061276d565b80611732846001600160a01b031660009081526020819052604090205490565b10156117505760405162461bcd60e51b815260040161085b906127b0565b601a546001600160a01b03848116911614806117795750601a546001600160a01b038381169116145b801561178f5750601a54600160a01b900460ff16155b15611a7a57601a546001600160a01b0384811691161461187c576010543060009081526020819052604081205490916117c7916127f6565b905060125481106117dd576117dd601254611b50565b6013546010541061187a576117f3601354611bf7565b6013546010600082825461180791906127f6565b9091555050600e546040516000916001600160a01b0316904780156108fc029184818181858888f193505050509050806118785760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b604482015260640161085b565b505b505b6001600160a01b03831660009081526011602052604081205460ff16806118bb57506001600160a01b03831660009081526011602052604090205460ff165b156118c7575080611a69565b600c5482111561193f5760405162461bcd60e51b815260206004820152603960248201527f45524332303a207472616e7366657220616d6f756e742065786365656473207460448201527f6865206d6178207472616e73616374696f6e20616d6f756e7400000000000000606482015260840161085b565b601a546001600160a01b03908116908516036119e857600d546001600160a01b03841660009081526020819052604090205461197b90846124d4565b11156119e85760405162461bcd60e51b815260206004820152603660248201527f45524332303a2062616c616e636520616d6f756e74206578636565646564206d604482015275185e081dd85b1b195d08185b5bdd5b9d081b1a5b5a5d60521b606482015260840161085b565b60006064600b54846119fa919061247b565b611a0491906126b2565b905060006064600a5485611a18919061247b565b611a2291906126b2565b9050611a2e81836124d4565b611a3890856127f6565b92508160106000828254611a4c91906124d4565b90915550611a6690508630611a6184866124d4565b611dd7565b50505b611a74848483611dd7565b50505050565b611a85838383611dd7565b505050565b6000611a9684846113de565b90506000198114611a745781811015611af15760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161085b565b611a7484848484036115a2565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601a805460ff60a01b1916600160a01b1790556000611b706002836126b2565b90506000611b7e82846127f6565b905047611b8a83611bf7565b6000611b9682476127f6565b9050611ba28382611ec3565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805460ff60a01b19169055505050565b601a805460ff60a01b1916600160a01b1790556040805160028082526060820183526000926020830190803683370190505090503081600081518110611c3f57611c3f612809565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce1919061281f565b81600181518110611cf457611cf4612809565b60200260200101906001600160a01b031690816001600160a01b031681525050611d3f307f0000000000000000000000000000000000000000000000000000000000000000846115a2565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611d9490859060009086903090429060040161283c565b600060405180830381600087803b158015611dae57600080fd5b505af1158015611dc2573d6000803e3d6000fd5b5050601a805460ff60a01b1916905550505050565b6001600160a01b038316611dfd5760405162461bcd60e51b815260040161085b90612728565b6001600160a01b038216611e235760405162461bcd60e51b815260040161085b9061276d565b6001600160a01b03831660009081526020819052604090205481811015611e5c5760405162461bcd60e51b815260040161085b906127b0565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b601a805460ff60a01b1916600160a01b179055611f01307f0000000000000000000000000000000000000000000000000000000000000000846115a2565b600e5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af1158015611f90573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611fb591906128ad565b5050601a805460ff60a01b19169055505050565b60005b83811015611fe4578181015183820152602001611fcc565b50506000910152565b60008151808452612005816020860160208601611fc9565b601f01601f19169290920160200192915050565b60208152600061202c6020830184611fed565b9392505050565b6001600160a01b038116811461154557600080fd5b6000806040838503121561205b57600080fd5b823561206681612033565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261209b57600080fd5b813567ffffffffffffffff808211156120b6576120b6612074565b604051601f8301601f19908116603f011681019082821181831017156120de576120de612074565b816040528381528660208588010111156120f757600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561212957600080fd5b813567ffffffffffffffff81111561214057600080fd5b61214c8482850161208a565b949350505050565b803580151581146113d957600080fd5b600080600080600060a0868803121561217c57600080fd5b853567ffffffffffffffff81111561219357600080fd5b61219f8882890161208a565b9550506121ae60208701612154565b93506121bc60408701612154565b94979396509394606081013594506080013592915050565b6000602082840312156121e657600080fd5b813561202c81612033565b60008060006060848603121561220657600080fd5b833561221181612033565b9250602084013561222181612033565b929592945050506040919091013590565b6000806040838503121561224557600080fd5b50508035926020909101359150565b6000806040838503121561226757600080fd5b823567ffffffffffffffff81111561227e57600080fd5b61228a8582860161208a565b92505061229960208401612154565b90509250929050565b6080815260006122b56080830187611fed565b9415156020830152506040810192909252606090910152919050565b6000806000606084860312156122e657600080fd5b6122ef84612154565b92506122fd60208501612154565b9150604084013590509250925092565b6000806040838503121561232057600080fd5b823561232b81612033565b9150602083013561233b81612033565b809150509250929050565b6000806040838503121561235957600080fd5b823561236481612033565b915061229960208401612154565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156123c35781600019048211156123a9576123a9612372565b808516156123b657918102915b93841c939080029061238d565b509250929050565b6000826123da5750600161095d565b816123e75750600061095d565b81600181146123fd576002811461240757612423565b600191505061095d565b60ff84111561241857612418612372565b50506001821b61095d565b5060208310610133831016604e8410600b8410161715612446575081810a61095d565b6124508383612388565b806000190482111561246457612464612372565b029392505050565b600061202c60ff8416836123cb565b600081600019048311821515161561249557612495612372565b500290565b600181811c908216806124ae57607f821691505b6020821081036124ce57634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561095d5761095d612372565b600082516124f9818460208701611fc9565b9190910192915050565b601f821115611a8557600081815260208120601f850160051c8101602086101561252a5750805b601f850160051c820191505b8181101561254957828155600101612536565b505050505050565b815167ffffffffffffffff81111561256b5761256b612074565b61257f81612579845461249a565b84612503565b602080601f8311600181146125b4576000841561259c5750858301515b600019600386901b1c1916600185901b178555612549565b600085815260208120601f198616915b828110156125e3578886015182559484019460019091019084016125c4565b50858210156126015787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815260006126246040830185611fed565b90508260208301529392505050565b60a08152600061264660a0830188611fed565b95151560208301525092151560408401526060830191909152608090910152919050565b60208082526028908201527f4c5020506169722063616e6e6f742062652074686520446561642077616c6c65604082015267742c206f7220302160c01b606082015260800190565b6000826126cf57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526034908201527f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206f666040820152732074686520737570706c79206174206f6e63652160601b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b8181038181111561095d5761095d612372565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561283157600080fd5b815161202c81612033565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561288c5784516001600160a01b031683529383019391830191600101612867565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156128c257600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212204783476ee060e0a8c5c8c67deb6523415dcc080b596e1c15d5ef11e7751aeb6764736f6c63430008100033
Deployed Bytecode
0x6080604052600436106102815760003560e01c8063768dc7101161014f578063af8af690116100c1578063df1d099e1161007a578063df1d099e1461076f578063df8408fe14610785578063f1b2b3d9146107a5578063f2fde38b146107c5578063f345bd85146107e5578063fbee93ba146107fb57600080fd5b8063af8af690146106c3578063b5c78e8a146106e3578063bb85c6d114610703578063c0fdea5714610723578063d12a768814610739578063dd62ed3e1461074f57600080fd5b8063a2330d9711610113578063a2330d9714610622578063a3996f7b14610642578063a457c2d714610657578063a9059cbb14610677578063aa4bde2814610697578063ad16a0cf146106ad57600080fd5b8063768dc710146105935780637930ef69146105c35780638c0b5e22146105d95780638da5cb5b146105ef57806395d89b411461060d57600080fd5b806323b872dd116101f3578063527ffabd116101ac578063527ffabd146104c257806363cdf60f146104d857806370a0823114610508578063715018a61461053e57806373c503b31461055357806375f0a8741461057357600080fd5b806323b872dd1461040657806330b63d8014610426578063313ce56714610446578063395093511461046257806349bd5a5e146104825780634fa74c4d146104a257600080fd5b80630f1d7ad9116102455780630f1d7ad9146103575780631694505e1461036a57806316a7b1601461039e57806318160ddd146103b157806318bc47f6146103c65780631b56bbf9146103e657600080fd5b806302ac81681461028d57806303fd2a45146102a4578063054dee0f146102e157806306fdde0314610305578063095ea7b31461032757600080fd5b3661028857005b600080fd5b34801561029957600080fd5b506102a2610811565b005b3480156102b057600080fd5b50600f546102c4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102ed57600080fd5b506102f760165481565b6040519081526020016102d8565b34801561031157600080fd5b5061031a6108b7565b6040516102d89190612019565b34801561033357600080fd5b50610347610342366004612048565b610949565b60405190151581526020016102d8565b6102a2610365366004612117565b610963565b34801561037657600080fd5b506102c47f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6102a26103ac366004612117565b610b10565b3480156103bd57600080fd5b506002546102f7565b3480156103d257600080fd5b506102a26103e1366004612164565b610cb2565b3480156103f257600080fd5b506102a26104013660046121d4565b610e0a565b34801561041257600080fd5b506103476104213660046121f1565b610eb4565b34801561043257600080fd5b50610347610441366004612232565b610ed8565b34801561045257600080fd5b50604051600981526020016102d8565b34801561046e57600080fd5b5061034761047d366004612048565b610f81565b34801561048e57600080fd5b50601a546102c4906001600160a01b031681565b3480156104ae57600080fd5b506103476104bd366004612254565b610fa3565b3480156104ce57600080fd5b506102f7600b5481565b3480156104e457600080fd5b506104f86104f3366004612117565b611006565b6040516102d894939291906122a2565b34801561051457600080fd5b506102f76105233660046121d4565b6001600160a01b031660009081526020819052604090205490565b34801561054a57600080fd5b506102a26110c7565b34801561055f57600080fd5b506102a261056e3660046122d1565b6110db565b34801561057f57600080fd5b50600e546102c4906001600160a01b031681565b34801561059f57600080fd5b506103476105ae3660046121d4565b60116020526000908152604090205460ff1681565b3480156105cf57600080fd5b506102f760185481565b3480156105e557600080fd5b506102f7600c5481565b3480156105fb57600080fd5b506005546001600160a01b03166102c4565b34801561061957600080fd5b5061031a611194565b34801561062e57600080fd5b506104f861063d366004612117565b6111a3565b34801561064e57600080fd5b506102a26111c9565b34801561066357600080fd5b50610347610672366004612048565b6111ef565b34801561068357600080fd5b50610347610692366004612048565b61126a565b3480156106a357600080fd5b506102f7600d5481565b3480156106b957600080fd5b506102f760135481565b3480156106cf57600080fd5b506103476106de366004612232565b611278565b3480156106ef57600080fd5b506102f76106fe366004612254565b611301565b34801561070f57600080fd5b5061034761071e3660046121d4565b61135c565b34801561072f57600080fd5b506102f760105481565b34801561074557600080fd5b506102f760125481565b34801561075b57600080fd5b506102f761076a36600461230d565b6113de565b34801561077b57600080fd5b506102f760195481565b34801561079157600080fd5b506102a26107a0366004612346565b611409565b3480156107b157600080fd5b506102f76107c0366004612254565b611474565b3480156107d157600080fd5b506102a26107e03660046121d4565b6114cf565b3480156107f157600080fd5b506102f7600a5481565b34801561080757600080fd5b506102f760175481565b610819611548565b6028600b54116108645760405162461bcd60e51b81526020600482015260116024820152704f6e652074696d6520757365206f6e6c7960781b60448201526064015b60405180910390fd5b6002600a9081556013600b556008546108829160ff9091169061246c565b61089090630103664161247b565b600c556008546108a49060ff16600a61246c565b6108b290630103664161247b565b600d55565b6060600380546108c69061249a565b80601f01602080910402602001604051908101604052809291908181526020018280546108f29061249a565b801561093f5780601f106109145761010080835404028352916020019161093f565b820191906000526020600020905b81548152906001019060200180831161092257829003601f168201915b5050505050905090565b6000336109578185856115a2565b60019150505b92915050565b6016543410156109ac5760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b604482015260640161085b565b601754333110156109f45760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b604482015260640161085b565b3460106000828254610a0691906124d4565b9091555050600f54601754610a289133916001600160a01b03909116906116c6565b604051806080016040528082815260200160011515815260200142815260200134601584604051610a5991906124e7565b908152602001604051809103902060030154610a7591906124d4565b815250601582604051610a8891906124e7565b90815260405190819003602001902081518190610aa59082612551565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f8382dfeb92e23123a91d983e4f179a9fbe329ff91e14e11cd3c3b5252f11512290610b059083904290612611565b60405180910390a150565b601654341015610b595760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f756768204554482073656e742160601b604482015260640161085b565b60175433311015610ba15760405162461bcd60e51b81526020600482015260126024820152714e6f7420656e6f75676820746f6b656e732160701b604482015260640161085b565b3460106000828254610bb391906124d4565b9091555050600f54601754610bd59133916001600160a01b03909116906116c6565b604051806080016040528082815260200160011515815260200142815260200134601484604051610c0691906124e7565b908152602001604051809103902060030154610c2291906124d4565b815250601482604051610c3591906124e7565b90815260405190819003602001902081518190610c529082612551565b50602082015160018201805460ff19169115159190911790556040808301516002830155606090920151600390910155517f892c7b6af36dc1cd7c78d56ead1e536ddf81fe5688e6b3f631cdfadf7ad4c50890610b059083904290612611565b610cba611548565b8315610d44576040518060800160405280868152602001841515815260200183815260200182815250601586604051610cf391906124e7565b90815260405190819003602001902081518190610d109082612551565b50602082015160018201805460ff191691151591909117905560408201516002820155606090910151600390910155610dc4565b6040518060800160405280868152602001841515815260200183815260200182815250601486604051610d7791906124e7565b90815260405190819003602001902081518190610d949082612551565b50602082015160018201805460ff1916911515919091179055604082015160028201556060909101516003909101555b7fc7da2a9b77928245e263afcf4e639fd44ae7d1970e45b7c6ff1a952442938caf8585858585604051610dfb959493929190612633565b60405180910390a15050505050565b610e12611548565b600f546001600160a01b0390811690821603610e405760405162461bcd60e51b815260040161085b9061266a565b6001600160a01b038116610e665760405162461bcd60e51b815260040161085b9061266a565b601a80546001600160a01b0319166001600160a01b0383169081179091556040519081527f1d288f7aba265e8b154b112bbb631ceca5df5fe93a750b2fe042fd1cc826647f90602001610b05565b600033610ec2858285611a8a565b610ecd8585856116c6565b506001949350505050565b6000610ee2611548565b6062600954610ef191906126b2565b8310610f0f5760405162461bcd60e51b815260040161085b906126d4565b6062600954610f1e91906126b2565b8210610f3c5760405162461bcd60e51b815260040161085b906126d4565b600854610f4d9060ff16600a61246c565b610f57908461247b565b601255600854610f6b9060ff16600a61246c565b610f75908361247b565b60135550600192915050565b600033610957818585610f9483836113de565b610f9e91906124d4565b6115a2565b60008115610fd857601583604051610fbb91906124e7565b9081526040519081900360200190206001015460ff16905061095d565b601483604051610fe891906124e7565b9081526040519081900360200190206001015460ff16905092915050565b805160208183018101805160148252928201919093012091528054819061102c9061249a565b80601f01602080910402602001604051908101604052809291908181526020018280546110589061249a565b80156110a55780601f1061107a576101008083540402835291602001916110a5565b820191906000526020600020905b81548152906001019060200180831161108857829003601f168201915b5050505060018301546002840154600390940154929360ff9091169290915084565b6110cf611548565b6110d96000611afe565b565b6110e3611548565b82156111035781156110f957601881905561114b565b601681905561114b565b811561112c5760085461111a9060ff16600a61246c565b611124908261247b565b60195561114b565b60085461113d9060ff16600a61246c565b611147908261247b565b6017555b60408051841515815283151560208201529081018290527fb87a29e1f0734b57d95308af5a136440c194441ac49edd417a1ed26aa78ceda29060600160405180910390a1505050565b6060600480546108c69061249a565b805160208183018101805160158252928201919093012091528054819061102c9061249a565b6111d1611548565b6001600a9081556002600b556008546108829160ff9091169061246c565b600033816111fd82866113de565b90508381101561125d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161085b565b610ecd82868684036115a2565b6000336109578185856116c6565b6000611282611548565b600a61128e83856124d4565b11156112f25760405162461bcd60e51b815260206004820152602d60248201527f45524332303a20746f74616c20746178206d757374206e6f742062652067726560448201526c61746572207468616e2031302560981b606482015260840161085b565b50600a91909155600b55600190565b600081156113325760158360405161131991906124e7565b908152602001604051809103902060030154905061095d565b60148360405161134291906124e7565b908152602001604051809103902060030154905092915050565b6000611366611548565b600f546001600160a01b03908116908316036113945760405162461bcd60e51b815260040161085b9061266a565b6001600160a01b0382166113ba5760405162461bcd60e51b815260040161085b9061266a565b50600e80546001600160a01b0319166001600160a01b03831617905560015b919050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611411611548565b6001600160a01b038216600081815260116020908152604091829020805460ff19168515159081179091558251938452908301527f318c131114339c004fff0a22fcdbbc0566bb2a7cd3aa1660e636ec5a66784ff2910160405180910390a15050565b600081156114a55760158360405161148c91906124e7565b908152602001604051809103902060020154905061095d565b6014836040516114b591906124e7565b908152602001604051809103902060020154905092915050565b6114d7611548565b6001600160a01b03811661153c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161085b565b61154581611afe565b50565b6005546001600160a01b031633146110d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161085b565b6001600160a01b0383166116045760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161085b565b6001600160a01b0382166116655760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161085b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166116ec5760405162461bcd60e51b815260040161085b90612728565b6001600160a01b0382166117125760405162461bcd60e51b815260040161085b9061276d565b80611732846001600160a01b031660009081526020819052604090205490565b10156117505760405162461bcd60e51b815260040161085b906127b0565b601a546001600160a01b03848116911614806117795750601a546001600160a01b038381169116145b801561178f5750601a54600160a01b900460ff16155b15611a7a57601a546001600160a01b0384811691161461187c576010543060009081526020819052604081205490916117c7916127f6565b905060125481106117dd576117dd601254611b50565b6013546010541061187a576117f3601354611bf7565b6013546010600082825461180791906127f6565b9091555050600e546040516000916001600160a01b0316904780156108fc029184818181858888f193505050509050806118785760405162461bcd60e51b815260206004820152601260248201527108cc2d2d8cac840e8de40e6cadcc8408aa8960731b604482015260640161085b565b505b505b6001600160a01b03831660009081526011602052604081205460ff16806118bb57506001600160a01b03831660009081526011602052604090205460ff165b156118c7575080611a69565b600c5482111561193f5760405162461bcd60e51b815260206004820152603960248201527f45524332303a207472616e7366657220616d6f756e742065786365656473207460448201527f6865206d6178207472616e73616374696f6e20616d6f756e7400000000000000606482015260840161085b565b601a546001600160a01b03908116908516036119e857600d546001600160a01b03841660009081526020819052604090205461197b90846124d4565b11156119e85760405162461bcd60e51b815260206004820152603660248201527f45524332303a2062616c616e636520616d6f756e74206578636565646564206d604482015275185e081dd85b1b195d08185b5bdd5b9d081b1a5b5a5d60521b606482015260840161085b565b60006064600b54846119fa919061247b565b611a0491906126b2565b905060006064600a5485611a18919061247b565b611a2291906126b2565b9050611a2e81836124d4565b611a3890856127f6565b92508160106000828254611a4c91906124d4565b90915550611a6690508630611a6184866124d4565b611dd7565b50505b611a74848483611dd7565b50505050565b611a85838383611dd7565b505050565b6000611a9684846113de565b90506000198114611a745781811015611af15760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161085b565b611a7484848484036115a2565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b601a805460ff60a01b1916600160a01b1790556000611b706002836126b2565b90506000611b7e82846127f6565b905047611b8a83611bf7565b6000611b9682476127f6565b9050611ba28382611ec3565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050601a805460ff60a01b19169055505050565b601a805460ff60a01b1916600160a01b1790556040805160028082526060820183526000926020830190803683370190505090503081600081518110611c3f57611c3f612809565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce1919061281f565b81600181518110611cf457611cf4612809565b60200260200101906001600160a01b031690816001600160a01b031681525050611d3f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846115a2565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790611d9490859060009086903090429060040161283c565b600060405180830381600087803b158015611dae57600080fd5b505af1158015611dc2573d6000803e3d6000fd5b5050601a805460ff60a01b1916905550505050565b6001600160a01b038316611dfd5760405162461bcd60e51b815260040161085b90612728565b6001600160a01b038216611e235760405162461bcd60e51b815260040161085b9061276d565b6001600160a01b03831660009081526020819052604090205481811015611e5c5760405162461bcd60e51b815260040161085b906127b0565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b601a805460ff60a01b1916600160a01b179055611f01307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846115a2565b600e5460405163f305d71960e01b81523060048201526024810184905260006044820181905260648201526001600160a01b0391821660848201524260a48201527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063f305d71990839060c40160606040518083038185885af1158015611f90573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611fb591906128ad565b5050601a805460ff60a01b19169055505050565b60005b83811015611fe4578181015183820152602001611fcc565b50506000910152565b60008151808452612005816020860160208601611fc9565b601f01601f19169290920160200192915050565b60208152600061202c6020830184611fed565b9392505050565b6001600160a01b038116811461154557600080fd5b6000806040838503121561205b57600080fd5b823561206681612033565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261209b57600080fd5b813567ffffffffffffffff808211156120b6576120b6612074565b604051601f8301601f19908116603f011681019082821181831017156120de576120de612074565b816040528381528660208588010111156120f757600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561212957600080fd5b813567ffffffffffffffff81111561214057600080fd5b61214c8482850161208a565b949350505050565b803580151581146113d957600080fd5b600080600080600060a0868803121561217c57600080fd5b853567ffffffffffffffff81111561219357600080fd5b61219f8882890161208a565b9550506121ae60208701612154565b93506121bc60408701612154565b94979396509394606081013594506080013592915050565b6000602082840312156121e657600080fd5b813561202c81612033565b60008060006060848603121561220657600080fd5b833561221181612033565b9250602084013561222181612033565b929592945050506040919091013590565b6000806040838503121561224557600080fd5b50508035926020909101359150565b6000806040838503121561226757600080fd5b823567ffffffffffffffff81111561227e57600080fd5b61228a8582860161208a565b92505061229960208401612154565b90509250929050565b6080815260006122b56080830187611fed565b9415156020830152506040810192909252606090910152919050565b6000806000606084860312156122e657600080fd5b6122ef84612154565b92506122fd60208501612154565b9150604084013590509250925092565b6000806040838503121561232057600080fd5b823561232b81612033565b9150602083013561233b81612033565b809150509250929050565b6000806040838503121561235957600080fd5b823561236481612033565b915061229960208401612154565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156123c35781600019048211156123a9576123a9612372565b808516156123b657918102915b93841c939080029061238d565b509250929050565b6000826123da5750600161095d565b816123e75750600061095d565b81600181146123fd576002811461240757612423565b600191505061095d565b60ff84111561241857612418612372565b50506001821b61095d565b5060208310610133831016604e8410600b8410161715612446575081810a61095d565b6124508383612388565b806000190482111561246457612464612372565b029392505050565b600061202c60ff8416836123cb565b600081600019048311821515161561249557612495612372565b500290565b600181811c908216806124ae57607f821691505b6020821081036124ce57634e487b7160e01b600052602260045260246000fd5b50919050565b8082018082111561095d5761095d612372565b600082516124f9818460208701611fc9565b9190910192915050565b601f821115611a8557600081815260208120601f850160051c8101602086101561252a5750805b601f850160051c820191505b8181101561254957828155600101612536565b505050505050565b815167ffffffffffffffff81111561256b5761256b612074565b61257f81612579845461249a565b84612503565b602080601f8311600181146125b4576000841561259c5750858301515b600019600386901b1c1916600185901b178555612549565b600085815260208120601f198616915b828110156125e3578886015182559484019460019091019084016125c4565b50858210156126015787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6040815260006126246040830185611fed565b90508260208301529392505050565b60a08152600061264660a0830188611fed565b95151560208301525092151560408401526060830191909152608090910152919050565b60208082526028908201527f4c5020506169722063616e6e6f742062652074686520446561642077616c6c65604082015267742c206f7220302160c01b606082015260800190565b6000826126cf57634e487b7160e01b600052601260045260246000fd5b500490565b60208082526034908201527f43616e6e6f74206c6971756964617465206d6f7265207468616e203225206f666040820152732074686520737570706c79206174206f6e63652160601b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b8181038181111561095d5761095d612372565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561283157600080fd5b815161202c81612033565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561288c5784516001600160a01b031683529383019391830191600101612867565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156128c257600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212204783476ee060e0a8c5c8c67deb6523415dcc080b596e1c15d5ef11e7751aeb6764736f6c63430008100033
Deployed Bytecode Sourcemap
28843:13386:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30057:269;;;;;;;;;;;;;:::i;:::-;;29514:64;;;;;;;;;;-1:-1:-1;29514:64:0;;;;-1:-1:-1;;;;;29514:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;29514:64:0;;;;;;;;30926:36;;;;;;;;;;;;;;;;;;;368:25:1;;;356:2;341:18;30926:36:0;222:177:1;18561:102:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20835:244::-;;;;;;;;;;-1:-1:-1;20835:244:0;;;;;:::i;:::-;;:::i;:::-;;;1781:14:1;;1774:22;1756:41;;1744:2;1729:18;20835:244:0;1616:187:1;32261:594:0;;;;;;:::i;:::-;;:::i;35054:51::-;;;;;;;;;;;;;;;31677:576;;;;;;:::i;:::-;;:::i;19699:110::-;;;;;;;;;;-1:-1:-1;19789:12:0;;19699:110;;33735:694;;;;;;;;;;-1:-1:-1;33735:694:0;;;;;:::i;:::-;;:::i;36319:288::-;;;;;;;;;;-1:-1:-1;36319:288:0;;;;;:::i;:::-;;:::i;21659:297::-;;;;;;;;;;-1:-1:-1;21659:297:0;;;;;:::i;:::-;;:::i;41583:602::-;;;;;;;;;;-1:-1:-1;41583:602:0;;;;;:::i;:::-;;:::i;19542:92::-;;;;;;;;;;-1:-1:-1;19542:92:0;;19625:1;5099:36:1;;5087:2;5072:18;19542:92:0;4957:184:1;23375:272:0;;;;;;;;;;-1:-1:-1;23375:272:0;;;;;:::i;:::-;;:::i;35112:28::-;;;;;;;;;;-1:-1:-1;35112:28:0;;;;-1:-1:-1;;;;;35112:28:0;;;32902:254;;;;;;;;;;-1:-1:-1;32902:254:0;;;;;:::i;:::-;;:::i;29218:35::-;;;;;;;;;;;;;;;;30804:50;;;;;;;;;;-1:-1:-1;30804:50:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;18726:177::-;;;;;;;;;;-1:-1:-1;18726:177:0;;;;;:::i;:::-;-1:-1:-1;;;;;18877:18:0;18845:7;18877:18;;;;;;;;;;;;18726:177;15820:103;;;;;;;;;;;;;:::i;34437:524::-;;;;;;;;;;-1:-1:-1;34437:524:0;;;;;:::i;:::-;;:::i;29432:75::-;;;;;;;;;;-1:-1:-1;29432:75:0;;;;-1:-1:-1;;;;;29432:75:0;;;29629:50;;;;;;;;;;-1:-1:-1;29629:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31028:39;;;;;;;;;;;;;;;;29308:53;;;;;;;;;;;;;;;;15172:87;;;;;;;;;;-1:-1:-1;15245:6:0;;-1:-1:-1;;;;;15245:6:0;15172:87;;18385:106;;;;;;;;;;;;;:::i;30861:56::-;;;;;;;;;;-1:-1:-1;30861:56:0;;;;;:::i;:::-;;:::i;29834:211::-;;;;;;;;;;;;;:::i;22459:507::-;;;;;;;;;;-1:-1:-1;22459:507:0;;;;;:::i;:::-;;:::i;20279:236::-;;;;;;;;;;-1:-1:-1;20279:236:0;;;;;:::i;:::-;;:::i;29368:57::-;;;;;;;;;;;;;;;;29762:63;;;;;;;;;;;;;;;;41184:391;;;;;;;;;;-1:-1:-1;41184:391:0;;;;;:::i;:::-;;:::i;33164:262::-;;;;;;;;;;-1:-1:-1;33164:262:0;;;;;:::i;:::-;;:::i;40826:350::-;;;;;;;;;;-1:-1:-1;40826:350:0;;;;;:::i;:::-;;:::i;29585:37::-;;;;;;;;;;;;;;;;29686:69;;;;;;;;;;;;;;;;19872:201;;;;;;;;;;-1:-1:-1;19872:201:0;;;;;:::i;:::-;;:::i;31074:54::-;;;;;;;;;;;;;;;;39237:189;;;;;;;;;;-1:-1:-1;39237:189:0;;;;;:::i;:::-;;:::i;33434:262::-;;;;;;;;;;-1:-1:-1;33434:262:0;;;;;:::i;:::-;;:::i;16078:238::-;;;;;;;;;;-1:-1:-1;16078:238:0;;;;;:::i;:::-;;:::i;29128:35::-;;;;;;;;;;;;;;;;30969:50;;;;;;;;;;;;;;;;30057:269;15058:13;:11;:13::i;:::-;30131:2:::1;30113:15;;:20;30105:50;;;::::0;-1:-1:-1;;;30105:50:0;;7227:2:1;30105:50:0::1;::::0;::::1;7209:21:1::0;7266:2;7246:18;;;7239:30;-1:-1:-1;;;7285:18:1;;;7278:47;7342:18;;30105:50:0::1;;;;;;;;;30184:1;30166:15;:19:::0;;;30214:2:::1;30196:15;:20:::0;30256:9:::1;::::0;30252:13:::1;::::0;30256:9:::1;::::0;;::::1;::::0;30252:13:::1;:::i;:::-;30241:24;::::0;:8:::1;:24;:::i;:::-;30227:11;:38:::0;30309:9:::1;::::0;30305:13:::1;::::0;30309:9:::1;;30305:2;:13;:::i;:::-;30294:24;::::0;:8:::1;:24;:::i;:::-;30276:15;:42:::0;30057:269::o;18561:102::-;18617:13;18650:5;18643:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18561:102;:::o;20835:244::-;20956:4;14045:10;21017:32;14045:10;21033:7;21042:6;21017:8;:32::i;:::-;21067:4;21060:11;;;20835:244;;;;;:::o;32261:594::-;32359:11;;32346:9;:24;;32338:57;;;;-1:-1:-1;;;32338:57:0;;9646:2:1;32338:57:0;;;9628:21:1;9685:2;9665:18;;;9658:30;-1:-1:-1;;;9704:18:1;;;9697:50;9764:18;;32338:57:0;9444:344:1;32338:57:0;32436:14;;32414:10;:18;:36;;32406:67;;;;-1:-1:-1;;;32406:67:0;;9995:2:1;32406:67:0;;;9977:21:1;10034:2;10014:18;;;10007:30;-1:-1:-1;;;10053:18:1;;;10046:48;10111:18;;32406:67:0;9793:342:1;32406:67:0;32506:9;32484:18;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;32548:4:0;;32554:14;;32526:43;;32536:10;;-1:-1:-1;;;;;32548:4:0;;;;32526:9;:43::i;:::-;32621:166;;;;;;;;32649:10;32621:166;;;;32674:4;32621:166;;;;;;32693:15;32621:166;;;;32767:9;32723:16;32740:10;32723:28;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;:53;;;;:::i;:::-;32621:166;;;32590:16;32607:10;32590:28;;;;;;:::i;:::-;;;;;;;;;;;;;;:197;;:28;;:197;;:28;:197;:::i;:::-;-1:-1:-1;32590:197:0;;;;;;;;;-1:-1:-1;;32590:197:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32803:44;;;;;32819:10;;32831:15;;32803:44;:::i;:::-;;;;;;;;32261:594;:::o;31677:576::-;31773:11;;31760:9;:24;;31752:57;;;;-1:-1:-1;;;31752:57:0;;9646:2:1;31752:57:0;;;9628:21:1;9685:2;9665:18;;;9658:30;-1:-1:-1;;;9704:18:1;;;9697:50;9764:18;;31752:57:0;9444:344:1;31752:57:0;31850:14;;31828:10;:18;:36;;31820:67;;;;-1:-1:-1;;;31820:67:0;;9995:2:1;31820:67:0;;;9977:21:1;10034:2;10014:18;;;10007:30;-1:-1:-1;;;10053:18:1;;;10046:48;10111:18;;31820:67:0;9793:342:1;31820:67:0;31920:9;31898:18;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;;31962:4:0;;31968:14;;31940:43;;31950:10;;-1:-1:-1;;;;;31962:4:0;;;;31940:9;:43::i;:::-;32025:162;;;;;;;;32050:11;32025:162;;;;32076:4;32025:162;;;;;;32095:15;32025:162;;;;32167:9;32125:13;32139:11;32125:26;;;;;;:::i;:::-;;;;;;;;;;;;;:39;;;:51;;;;:::i;:::-;32025:162;;;31996:13;32010:11;31996:26;;;;;;:::i;:::-;;;;;;;;;;;;;;:191;;:26;;:191;;:26;:191;:::i;:::-;-1:-1:-1;31996:191:0;;;;;;;;;-1:-1:-1;;31996:191:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32203:42;;;;;32216:11;;32229:15;;32203:42;:::i;33735:694::-;15058:13;:11;:13::i;:::-;33901:10:::1;33897:430;;;33961:147;;;;;;;;33993:12;33961:147;;;;34024:11;33961:147;;;;;;34054:12;33961:147;;;;34085:8;33961:147;;::::0;33928:16:::1;33945:12;33928:30;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:180;;:30;;:180:::1;::::0;:30;:180:::1;:::i;:::-;-1:-1:-1::0;33928:180:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;33928:180:0::1;::::0;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;33897:430:::1;;;34171:144;;;;;;;;34200:12;34171:144;;;;34231:11;34171:144;;;;;;34261:12;34171:144;;;;34292:8;34171:144;;::::0;34141:13:::1;34155:12;34141:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:174;;:27;;:174:::1;::::0;:27;:174:::1;:::i;:::-;-1:-1:-1::0;34141:174:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;34141:174:0::1;::::0;::::1;;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;33897:430:::1;34342:79;34359:12;34373:10;34385:11;34398:12;34412:8;34342:79;;;;;;;;;;:::i;:::-;;;;;;;;33735:694:::0;;;;;:::o;36319:288::-;15058:13;:11;:13::i;:::-;36401:4:::1;::::0;-1:-1:-1;;;;;36401:4:0;;::::1;36392:13:::0;;::::1;::::0;36384:66:::1;;;;-1:-1:-1::0;;;36384:66:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36469:19:0;::::1;36461:72;;;;-1:-1:-1::0;;;36461:72:0::1;;;;;;;:::i;:::-;36544:13;:21:::0;;-1:-1:-1;;;;;;36544:21:0::1;-1:-1:-1::0;;;;;36544:21:0;::::1;::::0;;::::1;::::0;;;36581:18:::1;::::0;160:51:1;;;36581:18:0::1;::::0;148:2:1;133:18;36581::0::1;14:203:1::0;21659:297:0;21792:4;14045:10;21850:38;21866:4;14045:10;21881:6;21850:15;:38::i;:::-;21899:27;21909:4;21915:2;21919:6;21899:9;:27::i;:::-;-1:-1:-1;21944:4:0;;21659:297;-1:-1:-1;;;;21659:297:0:o;41583:602::-;41740:4;15058:13;:11;:13::i;:::-;41813:2:::1;41803:7;;:12;;;;:::i;:::-;41770:30;:45;41762:110;;;;-1:-1:-1::0;;;41762:110:0::1;;;;;;;:::i;:::-;41928:2;41918:7;;:12;;;;:::i;:::-;41891:24;:39;41883:104;;;;-1:-1:-1::0;;;41883:104:0::1;;;;;;;:::i;:::-;42067:9;::::0;42063:13:::1;::::0;42067:9:::1;;42063:2;:13;:::i;:::-;42030:46;::::0;:30;:46:::1;:::i;:::-;41998:29;:78:::0;42144:9:::1;::::0;42140:13:::1;::::0;42144:9:::1;;42140:2;:13;:::i;:::-;42113:40;::::0;:24;:40:::1;:::i;:::-;42087:23;:66:::0;-1:-1:-1;42173:4:0::1;41583:602:::0;;;;:::o;23375:272::-;23492:4;14045:10;23553:64;14045:10;23569:7;23606:10;23578:25;14045:10;23569:7;23578:9;:25::i;:::-;:38;;;;:::i;:::-;23553:8;:64::i;32902:254::-;32989:4;33010:10;33006:89;;;33044:16;33061:12;33044:30;;;;;;:::i;:::-;;;;;;;;;;;;;;:39;;;;;;-1:-1:-1;33037:46:0;;33006:89;33112:13;33126:12;33112:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;;;;-1:-1:-1;32902:254:0;;;;:::o;30804:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;30804:50:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30804:50:0;:::o;15820:103::-;15058:13;:11;:13::i;:::-;15885:30:::1;15912:1;15885:18;:30::i;:::-;15820:103::o:0;34437:524::-;15058:13;:11;:13::i;:::-;34530:6:::1;34526:374;;;34557:10;34553:133;;;34588:14;:22:::0;;;34526:374:::1;;34553:133;34651:11;:19:::0;;;34526:374:::1;;;34722:10;34718:171;;;34785:9;::::0;34781:13:::1;::::0;34785:9:::1;;34781:2;:13;:::i;:::-;34773:21;::::0;:5;:21:::1;:::i;:::-;34753:17;:41:::0;34718:171:::1;;;34864:9;::::0;34860:13:::1;::::0;34864:9:::1;;34860:2;:13;:::i;:::-;34852:21;::::0;:5;:21:::1;:::i;:::-;34835:14;:38:::0;34718:171:::1;34915:38;::::0;;14863:14:1;;14856:22;14838:41;;14922:14;;14915:22;14910:2;14895:18;;14888:50;14954:18;;;14947:34;;;34915:38:0::1;::::0;14826:2:1;14811:18;34915:38:0::1;;;;;;;34437:524:::0;;;:::o;18385:106::-;18443:13;18476:7;18469:14;;;;;:::i;30861:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29834:211::-;15058:13;:11;:13::i;:::-;29904:1:::1;29886:15;:19:::0;;;29934:1:::1;29916:15;:19:::0;29975:9:::1;::::0;29971:13:::1;::::0;29975:9:::1;::::0;;::::1;::::0;29971:13:::1;:::i;22459:507::-:0;22581:4;14045:10;22581:4;22669:25;14045:10;22686:7;22669:9;:25::i;:::-;22642:52;;22747:15;22727:16;:35;;22705:122;;;;-1:-1:-1;;;22705:122:0;;15194:2:1;22705:122:0;;;15176:21:1;15233:2;15213:18;;;15206:30;15272:34;15252:18;;;15245:62;-1:-1:-1;;;15323:18:1;;;15316:35;15368:19;;22705:122:0;14992:401:1;22705:122:0;22863:60;22872:5;22879:7;22907:15;22888:16;:34;22863:8;:60::i;20279:236::-;20396:4;14045:10;20457:28;14045:10;20474:2;20478:6;20457:9;:28::i;41184:391::-;41332:4;15058:13;:11;:13::i;:::-;41401:2:::1;41363:33;41380:16:::0;41363;:33:::1;:::i;:::-;41362:41;;41354:99;;;::::0;-1:-1:-1;;;41354:99:0;;15600:2:1;41354:99:0::1;::::0;::::1;15582:21:1::0;15639:2;15619:18;;;15612:30;15678:34;15658:18;;;15651:62;-1:-1:-1;;;15729:18:1;;;15722:43;15782:19;;41354:99:0::1;15398:409:1::0;41354:99:0::1;-1:-1:-1::0;41464:15:0::1;:34:::0;;;;41509:15:::1;:34:::0;41563:4:::1;::::0;41184:391::o;33164:262::-;33251:4;33272:10;33268:93;;;33306:16;33323:12;33306:30;;;;;;:::i;:::-;;;;;;;;;;;;;:43;;;33299:50;;;;33268:93;33378:13;33392:12;33378:27;;;;;;:::i;:::-;;;;;;;;;;;;;:40;;;33371:47;;33164:262;;;;:::o;40826:350::-;40929:4;15058:13;:11;:13::i;:::-;40972:4:::1;::::0;-1:-1:-1;;;;;40972:4:0;;::::1;40959:17:::0;;::::1;::::0;40951:70:::1;;;;-1:-1:-1::0;;;40951:70:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41040:23:0;::::1;41032:76;;;;-1:-1:-1::0;;;41032:76:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;41119:15:0::1;:27:::0;;-1:-1:-1;;;;;;41119:27:0::1;-1:-1:-1::0;;;;;41119:27:0;::::1;;::::0;;-1:-1:-1;15082:1:0::1;40826:350:::0;;;:::o;19872:201::-;-1:-1:-1;;;;;20038:18:0;;;20006:7;20038:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19872:201::o;39237:189::-;15058:13;:11;:13::i;:::-;-1:-1:-1;;;;;39323:28:0;::::1;;::::0;;;:18:::1;:28;::::0;;;;;;;;:38;;-1:-1:-1;;39323:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;39377:41;;15980:51:1;;;16047:18;;;16040:50;39377:41:0::1;::::0;15953:18:1;39377:41:0::1;;;;;;;39237:189:::0;;:::o;33434:262::-;33525:4;33546:10;33542:91;;;33580:16;33597:12;33580:30;;;;;;:::i;:::-;;;;;;;;;;;;;:41;;;33573:48;;;;33542:91;33650:13;33664:12;33650:27;;;;;;:::i;:::-;;;;;;;;;;;;;:38;;;33643:45;;33434:262;;;;:::o;16078:238::-;15058:13;:11;:13::i;:::-;-1:-1:-1;;;;;16181:22:0;::::1;16159:110;;;::::0;-1:-1:-1;;;16159:110:0;;16303:2:1;16159:110:0::1;::::0;::::1;16285:21:1::0;16342:2;16322:18;;;16315:30;16381:34;16361:18;;;16354:62;-1:-1:-1;;;16432:18:1;;;16425:36;16478:19;;16159:110:0::1;16101:402:1::0;16159:110:0::1;16280:28;16299:8;16280:18;:28::i;:::-;16078:238:::0;:::o;15337:132::-;15245:6;;-1:-1:-1;;;;;15245:6:0;14045:10;15401:23;15393:68;;;;-1:-1:-1;;;15393:68:0;;16710:2:1;15393:68:0;;;16692:21:1;;;16729:18;;;16722:30;16788:34;16768:18;;;16761:62;16840:18;;15393:68:0;16508:356:1;25682:380:0;-1:-1:-1;;;;;25818:19:0;;25810:68;;;;-1:-1:-1;;;25810:68:0;;17071:2:1;25810:68:0;;;17053:21:1;17110:2;17090:18;;;17083:30;17149:34;17129:18;;;17122:62;-1:-1:-1;;;17200:18:1;;;17193:34;17244:19;;25810:68:0;16869:400:1;25810:68:0;-1:-1:-1;;;;;25897:21:0;;25889:68;;;;-1:-1:-1;;;25889:68:0;;17476:2:1;25889:68:0;;;17458:21:1;17515:2;17495:18;;;17488:30;17554:34;17534:18;;;17527:62;-1:-1:-1;;;17605:18:1;;;17598:32;17647:19;;25889:68:0;17274:398:1;25889:68:0;-1:-1:-1;;;;;25970:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;26022:32;;368:25:1;;;26022:32:0;;341:18:1;26022:32:0;;;;;;;25682:380;;;:::o;37085:2144::-;-1:-1:-1;;;;;37183:18:0;;37175:68;;;;-1:-1:-1;;;37175:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37262:16:0;;37254:64;;;;-1:-1:-1;;;37254:64:0;;;;;;;:::i;:::-;37356:6;37337:15;37347:4;-1:-1:-1;;;;;18877:18:0;18845:7;18877:18;;;;;;;;;;;;18726:177;37337:15;:25;;37329:76;;;;-1:-1:-1;;;37329:76:0;;;;;;;:::i;:::-;37431:13;;-1:-1:-1;;;;;37423:21:0;;;37431:13;;37423:21;;:44;;-1:-1:-1;37454:13:0;;-1:-1:-1;;;;;37448:19:0;;;37454:13;;37448:19;37423:44;37422:67;;;;-1:-1:-1;37473:16:0;;-1:-1:-1;;;37473:16:0;;;;37472:17;37422:67;37418:1804;;;37518:13;;-1:-1:-1;;;;;37510:21:0;;;37518:13;;37510:21;37506:681;;37614:18;;37605:4;37552:32;18877:18;;;;;;;;;;;37552:32;;37587:45;;;:::i;:::-;37552:80;;37683:29;;37655:24;:57;37651:152;;37737:46;37753:29;;37737:15;:46::i;:::-;37849:23;;37826:18;;37825:47;37821:351;;37897:42;37915:23;;37897:17;:42::i;:::-;37984:23;;37962:18;;:45;;;;;;;:::i;:::-;;;;-1:-1:-1;;38050:15:0;;38042:52;;38030:9;;-1:-1:-1;;;;;38050:15:0;;38072:21;38042:52;;;;;38030:9;38042:52;38030:9;38042:52;38072:21;38050:15;38042:52;;;;;;;38030:64;;38125:4;38117:35;;;;-1:-1:-1;;;38117:35:0;;19229:2:1;38117:35:0;;;19211:21:1;19268:2;19248:18;;;19241:30;-1:-1:-1;;;19287:18:1;;;19280:48;19345:18;;38117:35:0;19027:342:1;38117:35:0;37874:298;37821:351;37533:654;37506:681;-1:-1:-1;;;;;38244:24:0;;38203:22;38244:24;;;:18;:24;;;;;;;;;:50;;-1:-1:-1;;;;;;38272:22:0;;;;;;:18;:22;;;;;;;;38244:50;38240:839;;;-1:-1:-1;38332:6:0;38240:839;;;38411:11;;38401:6;:21;;38393:91;;;;-1:-1:-1;;;38393:91:0;;19576:2:1;38393:91:0;;;19558:21:1;19615:2;19595:18;;;19588:30;19654:34;19634:18;;;19627:62;19725:27;19705:18;;;19698:55;19770:19;;38393:91:0;19374:421:1;38393:91:0;38514:13;;-1:-1:-1;;;;;38514:13:0;;;38506:21;;;;38503:178;;38587:15;;-1:-1:-1;;;;;18877:18:0;;18845:7;18877:18;;;;;;;;;;;38560:22;;:6;:22;:::i;:::-;38559:43;;38551:110;;;;-1:-1:-1;;;38551:110:0;;20002:2:1;38551:110:0;;;19984:21:1;20041:2;20021:18;;;20014:30;20080:34;20060:18;;;20053:62;-1:-1:-1;;;20131:18:1;;;20124:52;20193:19;;38551:110:0;19800:418:1;38551:110:0;38701:22;38756:3;38737:15;;38728:6;:24;;;;:::i;:::-;38727:32;;;;:::i;:::-;38701:59;;38779:22;38834:3;38815:15;;38806:6;:24;;;;:::i;:::-;38805:32;;;;:::i;:::-;38779:59;-1:-1:-1;38884:31:0;38779:59;38884:14;:31;:::i;:::-;38874:42;;:6;:42;:::i;:::-;38857:59;;38957:14;38935:18;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;38992:71:0;;-1:-1:-1;39008:4:0;39022;39030:31;39047:14;39030;:31;:::i;:::-;38992:15;:71::i;:::-;38374:705;;38240:839;39093:41;39109:4;39115:2;39119:14;39093:15;:41::i;:::-;37491:1655;37085:2144;;;:::o;37418:1804::-;39177:33;39193:4;39199:2;39203:6;39177:15;:33::i;:::-;37085:2144;;;:::o;26353:502::-;26488:24;26515:25;26525:5;26532:7;26515:9;:25::i;:::-;26488:52;;-1:-1:-1;;26555:16:0;:37;26551:297;;26655:6;26635:16;:26;;26609:117;;;;-1:-1:-1;;;26609:117:0;;20425:2:1;26609:117:0;;;20407:21:1;20464:2;20444:18;;;20437:30;20503:31;20483:18;;;20476:59;20552:18;;26609:117:0;20223:353:1;26609:117:0;26770:51;26779:5;26786:7;26814:6;26795:16;:25;26770:8;:51::i;16476:191::-;16569:6;;;-1:-1:-1;;;;;16586:17:0;;;-1:-1:-1;;;;;;16586:17:0;;;;;;;16619:40;;16569:6;;;16586:17;16569:6;;16619:40;;16550:16;;16619:40;16539:128;16476:191;:::o;39434:474::-;35352:16;:23;;-1:-1:-1;;;;35352:23:0;-1:-1:-1;;;35352:23:0;;;;39536:24:::1;39559:1;39536:20:::0;:24:::1;:::i;:::-;39520:41:::0;-1:-1:-1;39572:17:0::1;39593:27;39520:41:::0;39593:20;:27:::1;:::i;:::-;39572:49:::0;-1:-1:-1;39659:21:0::1;39693:23;39711:4:::0;39693:17:::1;:23::i;:::-;39729:18;39751:38;39775:14:::0;39751:21:::1;:38;:::i;:::-;39729:61;;39803:36;39817:9;39828:10;39803:13;:36::i;:::-;39857:43;::::0;;20783:25:1;;;20839:2;20824:18;;20817:34;;;20867:18;;;20860:34;;;39857:43:0::1;::::0;20771:2:1;20756:18;39857:43:0::1;;;;;;;-1:-1:-1::0;;35398:16:0;:24;;-1:-1:-1;;;;35398:24:0;;;-1:-1:-1;;;39434:474:0:o;39916:488::-;35352:16;:23;;-1:-1:-1;;;;35352:23:0;-1:-1:-1;;;35352:23:0;;;40019:16:::1;::::0;;40033:1:::1;40019:16:::0;;;;;::::1;::::0;;-1:-1:-1;;40019:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;40019:16:0::1;39995:40;;40064:4;40046;40051:1;40046:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;40046:23:0::1;;;-1:-1:-1::0;;;;;40046:23:0::1;;;::::0;::::1;40090:15;-1:-1:-1::0;;;;;40090:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40080:4;40085:1;40080:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1::0;;;;;40080:32:0::1;;;-1:-1:-1::0;;;;;40080:32:0::1;;;::::0;::::1;40125:62;40142:4;40157:15;40175:11;40125:8;:62::i;:::-;40200:196;::::0;-1:-1:-1;;;40200:196:0;;-1:-1:-1;;;;;40200:15:0::1;:66;::::0;::::1;::::0;:196:::1;::::0;40281:11;;40307:1:::1;::::0;40323:4;;40350::::1;::::0;40370:15:::1;::::0;40200:196:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;35398:16:0;:24;;-1:-1:-1;;;;35398:24:0;;;-1:-1:-1;;;;39916:488:0:o;26863:776::-;-1:-1:-1;;;;;26994:18:0;;26986:68;;;;-1:-1:-1;;;26986:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27073:16:0;;27065:64;;;;-1:-1:-1;;;27065:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27164:15:0;;27142:19;27164:15;;;;;;;;;;;27212:21;;;;27190:109;;;;-1:-1:-1;;;27190:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27335:15:0;;;:9;:15;;;;;;;;;;;27353:20;;;27335:38;;27553:13;;;;;;;;;;:23;;;;;;27605:26;;368:25:1;;;27553:13:0;;27605:26;;341:18:1;27605:26:0;;;;;;;26975:664;26863:776;;;:::o;40412:406::-;35352:16;:23;;-1:-1:-1;;;;35352:23:0;-1:-1:-1;;;35352:23:0;;;40529:62:::1;40546:4;40561:15;40579:11:::0;40529:8:::1;:62::i;:::-;40754:15;::::0;40604:206:::1;::::0;-1:-1:-1;;;40604:206:0;;40676:4:::1;40604:206;::::0;::::1;22619:34:1::0;22669:18;;;22662:34;;;40722:1:0::1;22712:18:1::0;;;22705:34;;;22755:18;;;22748:34;-1:-1:-1;;;;;40754:15:0;;::::1;22798:19:1::0;;;22791:44;40784:15:0::1;22851:19:1::0;;;22844:35;40604:15:0::1;:31:::0;;::::1;::::0;::::1;::::0;40643:9;;22553:19:1;;40604:206:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;35398:16:0;:24;;-1:-1:-1;;;;35398:24:0;;;-1:-1:-1;;;40412:406:0:o;404:250:1:-;489:1;499:113;513:6;510:1;507:13;499:113;;;589:11;;;583:18;570:11;;;563:39;535:2;528:10;499:113;;;-1:-1:-1;;646:1:1;628:16;;621:27;404:250::o;659:271::-;701:3;739:5;733:12;766:6;761:3;754:19;782:76;851:6;844:4;839:3;835:14;828:4;821:5;817:16;782:76;:::i;:::-;912:2;891:15;-1:-1:-1;;887:29:1;878:39;;;;919:4;874:50;;659:271;-1:-1:-1;;659:271:1:o;935:220::-;1084:2;1073:9;1066:21;1047:4;1104:45;1145:2;1134:9;1130:18;1122:6;1104:45;:::i;:::-;1096:53;935:220;-1:-1:-1;;;935:220:1:o;1160:131::-;-1:-1:-1;;;;;1235:31:1;;1225:42;;1215:70;;1281:1;1278;1271:12;1296:315;1364:6;1372;1425:2;1413:9;1404:7;1400:23;1396:32;1393:52;;;1441:1;1438;1431:12;1393:52;1480:9;1467:23;1499:31;1524:5;1499:31;:::i;:::-;1549:5;1601:2;1586:18;;;;1573:32;;-1:-1:-1;;;1296:315:1:o;1808:127::-;1869:10;1864:3;1860:20;1857:1;1850:31;1900:4;1897:1;1890:15;1924:4;1921:1;1914:15;1940:719;1983:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:55;;2054:1;2051;2044:12;2003:55;2090:6;2077:20;2116:18;2153:2;2149;2146:10;2143:36;;;2159:18;;:::i;:::-;2234:2;2228:9;2202:2;2288:13;;-1:-1:-1;;2284:22:1;;;2308:2;2280:31;2276:40;2264:53;;;2332:18;;;2352:22;;;2329:46;2326:72;;;2378:18;;:::i;:::-;2418:10;2414:2;2407:22;2453:2;2445:6;2438:18;2499:3;2492:4;2487:2;2479:6;2475:15;2471:26;2468:35;2465:55;;;2516:1;2513;2506:12;2465:55;2580:2;2573:4;2565:6;2561:17;2554:4;2546:6;2542:17;2529:54;2627:1;2620:4;2615:2;2607:6;2603:15;2599:26;2592:37;2647:6;2638:15;;;;;;1940:719;;;;:::o;2664:322::-;2733:6;2786:2;2774:9;2765:7;2761:23;2757:32;2754:52;;;2802:1;2799;2792:12;2754:52;2842:9;2829:23;2875:18;2867:6;2864:30;2861:50;;;2907:1;2904;2897:12;2861:50;2930;2972:7;2963:6;2952:9;2948:22;2930:50;:::i;:::-;2920:60;2664:322;-1:-1:-1;;;;2664:322:1:o;3225:160::-;3290:20;;3346:13;;3339:21;3329:32;;3319:60;;3375:1;3372;3365:12;3390:596;3489:6;3497;3505;3513;3521;3574:3;3562:9;3553:7;3549:23;3545:33;3542:53;;;3591:1;3588;3581:12;3542:53;3631:9;3618:23;3664:18;3656:6;3653:30;3650:50;;;3696:1;3693;3686:12;3650:50;3719;3761:7;3752:6;3741:9;3737:22;3719:50;:::i;:::-;3709:60;;;3788:35;3819:2;3808:9;3804:18;3788:35;:::i;:::-;3778:45;;3842:35;3873:2;3862:9;3858:18;3842:35;:::i;:::-;3390:596;;;;-1:-1:-1;3832:45:1;;3924:2;3909:18;;3896:32;;-1:-1:-1;3975:3:1;3960:19;3947:33;;3390:596;-1:-1:-1;;3390:596:1:o;3991:247::-;4050:6;4103:2;4091:9;4082:7;4078:23;4074:32;4071:52;;;4119:1;4116;4109:12;4071:52;4158:9;4145:23;4177:31;4202:5;4177:31;:::i;4243:456::-;4320:6;4328;4336;4389:2;4377:9;4368:7;4364:23;4360:32;4357:52;;;4405:1;4402;4395:12;4357:52;4444:9;4431:23;4463:31;4488:5;4463:31;:::i;:::-;4513:5;-1:-1:-1;4570:2:1;4555:18;;4542:32;4583:33;4542:32;4583:33;:::i;:::-;4243:456;;4635:7;;-1:-1:-1;;;4689:2:1;4674:18;;;;4661:32;;4243:456::o;4704:248::-;4772:6;4780;4833:2;4821:9;4812:7;4808:23;4804:32;4801:52;;;4849:1;4846;4839:12;4801:52;-1:-1:-1;;4872:23:1;;;4942:2;4927:18;;;4914:32;;-1:-1:-1;4704:248:1:o;5146:390::-;5221:6;5229;5282:2;5270:9;5261:7;5257:23;5253:32;5250:52;;;5298:1;5295;5288:12;5250:52;5338:9;5325:23;5371:18;5363:6;5360:30;5357:50;;;5403:1;5400;5393:12;5357:50;5426;5468:7;5459:6;5448:9;5444:22;5426:50;:::i;:::-;5416:60;;;5495:35;5526:2;5515:9;5511:18;5495:35;:::i;:::-;5485:45;;5146:390;;;;;:::o;5541:445::-;5768:3;5757:9;5750:22;5731:4;5789:46;5830:3;5819:9;5815:19;5807:6;5789:46;:::i;:::-;5878:14;;5871:22;5866:2;5851:18;;5844:50;-1:-1:-1;5925:2:1;5910:18;;5903:34;;;;5968:2;5953:18;;;5946:34;5781:54;5541:445;-1:-1:-1;5541:445:1:o;5991:316::-;6062:6;6070;6078;6131:2;6119:9;6110:7;6106:23;6102:32;6099:52;;;6147:1;6144;6137:12;6099:52;6170:26;6186:9;6170:26;:::i;:::-;6160:36;;6215:35;6246:2;6235:9;6231:18;6215:35;:::i;:::-;6205:45;;6297:2;6286:9;6282:18;6269:32;6259:42;;5991:316;;;;;:::o;6312:388::-;6380:6;6388;6441:2;6429:9;6420:7;6416:23;6412:32;6409:52;;;6457:1;6454;6447:12;6409:52;6496:9;6483:23;6515:31;6540:5;6515:31;:::i;:::-;6565:5;-1:-1:-1;6622:2:1;6607:18;;6594:32;6635:33;6594:32;6635:33;:::i;:::-;6687:7;6677:17;;;6312:388;;;;;:::o;6705:315::-;6770:6;6778;6831:2;6819:9;6810:7;6806:23;6802:32;6799:52;;;6847:1;6844;6837:12;6799:52;6886:9;6873:23;6905:31;6930:5;6905:31;:::i;:::-;6955:5;-1:-1:-1;6979:35:1;7010:2;6995:18;;6979:35;:::i;7371:127::-;7432:10;7427:3;7423:20;7420:1;7413:31;7463:4;7460:1;7453:15;7487:4;7484:1;7477:15;7503:422;7592:1;7635:5;7592:1;7649:270;7670:7;7660:8;7657:21;7649:270;;;7729:4;7725:1;7721:6;7717:17;7711:4;7708:27;7705:53;;;7738:18;;:::i;:::-;7788:7;7778:8;7774:22;7771:55;;;7808:16;;;;7771:55;7887:22;;;;7847:15;;;;7649:270;;;7653:3;7503:422;;;;;:::o;7930:806::-;7979:5;8009:8;7999:80;;-1:-1:-1;8050:1:1;8064:5;;7999:80;8098:4;8088:76;;-1:-1:-1;8135:1:1;8149:5;;8088:76;8180:4;8198:1;8193:59;;;;8266:1;8261:130;;;;8173:218;;8193:59;8223:1;8214:10;;8237:5;;;8261:130;8298:3;8288:8;8285:17;8282:43;;;8305:18;;:::i;:::-;-1:-1:-1;;8361:1:1;8347:16;;8376:5;;8173:218;;8475:2;8465:8;8462:16;8456:3;8450:4;8447:13;8443:36;8437:2;8427:8;8424:16;8419:2;8413:4;8410:12;8406:35;8403:77;8400:159;;;-1:-1:-1;8512:19:1;;;8544:5;;8400:159;8591:34;8616:8;8610:4;8591:34;:::i;:::-;8661:6;8657:1;8653:6;8649:19;8640:7;8637:32;8634:58;;;8672:18;;:::i;:::-;8710:20;;7930:806;-1:-1:-1;;;7930:806:1:o;8741:140::-;8799:5;8828:47;8869:4;8859:8;8855:19;8849:4;8828:47;:::i;8886:168::-;8926:7;8992:1;8988;8984:6;8980:14;8977:1;8974:21;8969:1;8962:9;8955:17;8951:45;8948:71;;;8999:18;;:::i;:::-;-1:-1:-1;9039:9:1;;8886:168::o;9059:380::-;9138:1;9134:12;;;;9181;;;9202:61;;9256:4;9248:6;9244:17;9234:27;;9202:61;9309:2;9301:6;9298:14;9278:18;9275:38;9272:161;;9355:10;9350:3;9346:20;9343:1;9336:31;9390:4;9387:1;9380:15;9418:4;9415:1;9408:15;9272:161;;9059:380;;;:::o;10140:125::-;10205:9;;;10226:10;;;10223:36;;;10239:18;;:::i;10270:289::-;10401:3;10439:6;10433:13;10455:66;10514:6;10509:3;10502:4;10494:6;10490:17;10455:66;:::i;:::-;10537:16;;;;;10270:289;-1:-1:-1;;10270:289:1:o;10690:545::-;10792:2;10787:3;10784:11;10781:448;;;10828:1;10853:5;10849:2;10842:17;10898:4;10894:2;10884:19;10968:2;10956:10;10952:19;10949:1;10945:27;10939:4;10935:38;11004:4;10992:10;10989:20;10986:47;;;-1:-1:-1;11027:4:1;10986:47;11082:2;11077:3;11073:12;11070:1;11066:20;11060:4;11056:31;11046:41;;11137:82;11155:2;11148:5;11145:13;11137:82;;;11200:17;;;11181:1;11170:13;11137:82;;;11141:3;;;10690:545;;;:::o;11411:1352::-;11537:3;11531:10;11564:18;11556:6;11553:30;11550:56;;;11586:18;;:::i;:::-;11615:97;11705:6;11665:38;11697:4;11691:11;11665:38;:::i;:::-;11659:4;11615:97;:::i;:::-;11767:4;;11831:2;11820:14;;11848:1;11843:663;;;;12550:1;12567:6;12564:89;;;-1:-1:-1;12619:19:1;;;12613:26;12564:89;-1:-1:-1;;11368:1:1;11364:11;;;11360:24;11356:29;11346:40;11392:1;11388:11;;;11343:57;12666:81;;11813:944;;11843:663;10637:1;10630:14;;;10674:4;10661:18;;-1:-1:-1;;11879:20:1;;;11997:236;12011:7;12008:1;12005:14;11997:236;;;12100:19;;;12094:26;12079:42;;12192:27;;;;12160:1;12148:14;;;;12027:19;;11997:236;;;12001:3;12261:6;12252:7;12249:19;12246:201;;;12322:19;;;12316:26;-1:-1:-1;;12405:1:1;12401:14;;;12417:3;12397:24;12393:37;12389:42;12374:58;12359:74;;12246:201;-1:-1:-1;;;;;12493:1:1;12477:14;;;12473:22;12460:36;;-1:-1:-1;11411:1352:1:o;12768:291::-;12945:2;12934:9;12927:21;12908:4;12965:45;13006:2;12995:9;12991:18;12983:6;12965:45;:::i;:::-;12957:53;;13046:6;13041:2;13030:9;13026:18;13019:34;12768:291;;;;;:::o;13064:527::-;13313:3;13302:9;13295:22;13276:4;13334:46;13375:3;13364:9;13360:19;13352:6;13334:46;:::i;:::-;13423:14;;13416:22;13411:2;13396:18;;13389:50;-1:-1:-1;13482:14:1;;13475:22;13470:2;13455:18;;13448:50;13529:2;13514:18;;13507:34;;;;13572:3;13557:19;;;13550:35;13326:54;13064:527;-1:-1:-1;13064:527:1:o;13596:404::-;13798:2;13780:21;;;13837:2;13817:18;;;13810:30;13876:34;13871:2;13856:18;;13849:62;-1:-1:-1;;;13942:2:1;13927:18;;13920:38;13990:3;13975:19;;13596:404::o;14005:217::-;14045:1;14071;14061:132;;14115:10;14110:3;14106:20;14103:1;14096:31;14150:4;14147:1;14140:15;14178:4;14175:1;14168:15;14061:132;-1:-1:-1;14207:9:1;;14005:217::o;14227:416::-;14429:2;14411:21;;;14468:2;14448:18;;;14441:30;14507:34;14502:2;14487:18;;14480:62;-1:-1:-1;;;14573:2:1;14558:18;;14551:50;14633:3;14618:19;;14227:416::o;17677:401::-;17879:2;17861:21;;;17918:2;17898:18;;;17891:30;17957:34;17952:2;17937:18;;17930:62;-1:-1:-1;;;18023:2:1;18008:18;;18001:35;18068:3;18053:19;;17677:401::o;18083:399::-;18285:2;18267:21;;;18324:2;18304:18;;;18297:30;18363:34;18358:2;18343:18;;18336:62;-1:-1:-1;;;18429:2:1;18414:18;;18407:33;18472:3;18457:19;;18083:399::o;18487:402::-;18689:2;18671:21;;;18728:2;18708:18;;;18701:30;18767:34;18762:2;18747:18;;18740:62;-1:-1:-1;;;18833:2:1;18818:18;;18811:36;18879:3;18864:19;;18487:402::o;18894:128::-;18961:9;;;18982:11;;;18979:37;;;18996:18;;:::i;20905:127::-;20966:10;20961:3;20957:20;20954:1;20947:31;20997:4;20994:1;20987:15;21021:4;21018:1;21011:15;21037:251;21107:6;21160:2;21148:9;21139:7;21135:23;21131:32;21128:52;;;21176:1;21173;21166:12;21128:52;21208:9;21202:16;21227:31;21252:5;21227:31;:::i;21293:980::-;21555:4;21603:3;21592:9;21588:19;21634:6;21623:9;21616:25;21660:2;21698:6;21693:2;21682:9;21678:18;21671:34;21741:3;21736:2;21725:9;21721:18;21714:31;21765:6;21800;21794:13;21831:6;21823;21816:22;21869:3;21858:9;21854:19;21847:26;;21908:2;21900:6;21896:15;21882:29;;21929:1;21939:195;21953:6;21950:1;21947:13;21939:195;;;22018:13;;-1:-1:-1;;;;;22014:39:1;22002:52;;22109:15;;;;22074:12;;;;22050:1;21968:9;21939:195;;;-1:-1:-1;;;;;;;22190:32:1;;;;22185:2;22170:18;;22163:60;-1:-1:-1;;;22254:3:1;22239:19;22232:35;22151:3;21293:980;-1:-1:-1;;;21293:980:1:o;22890:306::-;22978:6;22986;22994;23047:2;23035:9;23026:7;23022:23;23018:32;23015:52;;;23063:1;23060;23053:12;23015:52;23092:9;23086:16;23076:26;;23142:2;23131:9;23127:18;23121:25;23111:35;;23186:2;23175:9;23171:18;23165:25;23155:35;;22890:306;;;;;:::o
Swarm Source
ipfs://4783476ee060e0a8c5c8c67deb6523415dcc080b596e1c15d5ef11e7751aeb67
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.