Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 134 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 21271389 | 4 days ago | IN | 0 ETH | 0.00039317 | ||||
Approve | 21189568 | 15 days ago | IN | 0 ETH | 0.00077769 | ||||
Approve | 21118348 | 25 days ago | IN | 0 ETH | 0.00029267 | ||||
Approve | 21116849 | 25 days ago | IN | 0 ETH | 0.0005504 | ||||
Approve | 21114799 | 26 days ago | IN | 0 ETH | 0.00052418 | ||||
Approve | 21114796 | 26 days ago | IN | 0 ETH | 0.00056469 | ||||
Approve | 21114753 | 26 days ago | IN | 0 ETH | 0.0004195 | ||||
Approve | 21114746 | 26 days ago | IN | 0 ETH | 0.00038898 | ||||
Approve | 21114745 | 26 days ago | IN | 0 ETH | 0.00038193 | ||||
Approve | 21083148 | 30 days ago | IN | 0 ETH | 0.00056112 | ||||
Approve | 21061354 | 33 days ago | IN | 0 ETH | 0.0001346 | ||||
Approve | 21061219 | 33 days ago | IN | 0 ETH | 0.0002553 | ||||
Approve | 21021217 | 39 days ago | IN | 0 ETH | 0.00041118 | ||||
Approve | 21020360 | 39 days ago | IN | 0 ETH | 0.00035291 | ||||
Approve | 21019080 | 39 days ago | IN | 0 ETH | 0.00030271 | ||||
Approve | 21016230 | 39 days ago | IN | 0 ETH | 0.00069351 | ||||
Approve | 21015857 | 40 days ago | IN | 0 ETH | 0.00044827 | ||||
Approve | 21015446 | 40 days ago | IN | 0 ETH | 0.00051293 | ||||
Approve | 21014967 | 40 days ago | IN | 0 ETH | 0.00056471 | ||||
Approve | 21014942 | 40 days ago | IN | 0 ETH | 0.00063716 | ||||
Approve | 21014873 | 40 days ago | IN | 0 ETH | 0.00076587 | ||||
Approve | 21014863 | 40 days ago | IN | 0 ETH | 0.00079102 | ||||
Approve | 21014848 | 40 days ago | IN | 0 ETH | 0.00081022 | ||||
Approve | 21014792 | 40 days ago | IN | 0 ETH | 0.00079219 | ||||
Approve | 21014788 | 40 days ago | IN | 0 ETH | 0.00078293 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21118358 | 25 days ago | 0.00413687 ETH | ||||
21118358 | 25 days ago | 0.00413687 ETH | ||||
21116851 | 25 days ago | 0.0015064 ETH | ||||
21116851 | 25 days ago | 0.0015064 ETH | ||||
21114798 | 26 days ago | 0.00958197 ETH | ||||
21114798 | 26 days ago | 0.00958197 ETH | ||||
21114782 | 26 days ago | 0.00594583 ETH | ||||
21114782 | 26 days ago | 0.00594583 ETH | ||||
21114773 | 26 days ago | 0.01644413 ETH | ||||
21114773 | 26 days ago | 0.01644413 ETH | ||||
21114758 | 26 days ago | 0.03053958 ETH | ||||
21114758 | 26 days ago | 0.03053958 ETH | ||||
21089091 | 29 days ago | 0.00776068 ETH | ||||
21089091 | 29 days ago | 0.00776068 ETH | ||||
21061222 | 33 days ago | 0.00401935 ETH | ||||
21061222 | 33 days ago | 0.00401935 ETH | ||||
21032518 | 37 days ago | 0.00232638 ETH | ||||
21032518 | 37 days ago | 0.00232638 ETH | ||||
21021217 | 39 days ago | 0.00407502 ETH | ||||
21021217 | 39 days ago | 0.00407502 ETH | ||||
21021133 | 39 days ago | 0.00222084 ETH | ||||
21021133 | 39 days ago | 0.00222084 ETH | ||||
21020368 | 39 days ago | 0.00418301 ETH | ||||
21020368 | 39 days ago | 0.00418301 ETH | ||||
21018961 | 39 days ago | 0.00232111 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
fairProtocol
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-10-19 */ // SPDX-License-Identifier: MIT // Twitter: https://twitter.com/fairprotocolxyz // Telegram: https://t.me/fairprotocolxyz // Website: https://fairprotocol.xyz/ pragma solidity >=0.6.2; interface IUniswapV2Router02 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } pragma solidity ^0.8.19; /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.19; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.19; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // fairprotocol.sol pragma solidity ^0.8.28; contract fairProtocol is ERC20, Ownable { using SafeMath for uint256; IUniswapV2Router02 public immutable uniswapRouter; address public uniswapV2Pair; bool private swapping; address public treasuryWallet; uint256 public maxTransactionAmount; uint256 public swapTokensAtAmount; uint256 public maxWallet; bool public limitsInEffect = true; bool public tradingActive = false; bool public swapEnabled = false; bool public blacklistRenounced = false; uint256 public buyTotalFees; uint256 public buyTreasuryFee; uint256 public sellTotalFees; uint256 public sellTreasuryFee; uint256 public tokensForTreasury; // exclude from fees and max transaction amount mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) public _isExcludedMaxTransactionAmount; mapping(address => bool) public automatedMarketMakerPairs; event UpdateUniswapRouter( address indexed newAddress, address indexed oldAddress ); event ExcludeFromFees(address indexed account, bool isExcluded); event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value); event treasuryWalletUpdated( address indexed newWallet, address indexed oldWallet ); constructor() ERC20("Fair Protocol", "FAIR") { IUniswapV2Router02 _uniswapRouter = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); excludeFromMaxTransaction(address(_uniswapRouter), true); uniswapRouter = _uniswapRouter; uint256 _buyTreasuryFee = 5; uint256 _sellTreasuryFee = 5; uint256 totalSupply = 10_000_000 * 1e18; maxTransactionAmount = totalSupply / 100; maxWallet = totalSupply / 100; swapTokensAtAmount = (totalSupply * 5) / 10000; buyTreasuryFee = _buyTreasuryFee; buyTotalFees = buyTreasuryFee; sellTreasuryFee = _sellTreasuryFee; sellTotalFees = sellTreasuryFee; treasuryWallet = msg.sender; excludeFromFees(owner(), true); excludeFromFees(address(this), true); excludeFromMaxTransaction(owner(), true); excludeFromMaxTransaction(address(this), true); _mint(msg.sender, totalSupply); } receive() external payable {} function createPair() external onlyOwner { uniswapV2Pair = IUniswapV2Factory(uniswapRouter.factory()) .createPair(address(this), uniswapRouter.WETH()); excludeFromMaxTransaction(address(uniswapV2Pair), true); _setAutomatedMarketMakerPair(address(uniswapV2Pair), true); } function enableTrading() external onlyOwner { tradingActive = true; swapEnabled = true; } // remove limits after token is stable function removeLimits() external onlyOwner returns (bool) { limitsInEffect = false; return true; } // change the minimum amount of tokens to sell from fees function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool) { swapTokensAtAmount = newAmount; return true; } function updateMaxTxnAmount(uint256 newNum) external onlyOwner { require( newNum >= ((totalSupply() * 5) / 1000) / 1e18, "Cannot set maxTransactionAmount lower than 0.5%" ); maxTransactionAmount = newNum * (10**18); } function updateMaxWalletAmount(uint256 newNum) external onlyOwner { require( newNum >= ((totalSupply() * 10) / 1000) / 1e18, "Cannot set maxWallet lower than 1.0%" ); maxWallet = newNum * (10**18); } function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner { _isExcludedMaxTransactionAmount[updAds] = isEx; } // only use to disable contract sales if absolutely necessary (emergency use only) function updateSwapEnabled(bool enabled) external onlyOwner { swapEnabled = enabled; } function updateBuyFees( uint256 _treasuryFee ) external onlyOwner { buyTreasuryFee = _treasuryFee; buyTotalFees = buyTreasuryFee; } function updateSellFees( uint256 _treasuryFee ) external onlyOwner { sellTreasuryFee = _treasuryFee; sellTotalFees = sellTreasuryFee; } function excludeFromFees(address account, bool excluded) public onlyOwner { _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require( pair != uniswapV2Pair, "The pair cannot be removed from automatedMarketMakerPairs" ); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { automatedMarketMakerPairs[pair] = value; emit SetAutomatedMarketMakerPair(pair, value); } function updateTreasuryWallet(address newWallet) external onlyOwner { emit treasuryWalletUpdated(newWallet, treasuryWallet); treasuryWallet = newWallet; } function isExcludedFromFees(address account) public view returns (bool) { return _isExcludedFromFees[account]; } 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"); if (amount == 0) { super._transfer(from, to, 0); return; } if (limitsInEffect) { if ( from != owner() && to != owner() && to != address(0) && !swapping ) { if (!tradingActive) { require( _isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading is not active." ); } //when buy if ( automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to] ) { require( amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount." ); require( amount + balanceOf(to) <= maxWallet, "Max wallet exceeded" ); } //when sell else if ( automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from] ) { require( amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount." ); } else if (!_isExcludedMaxTransactionAmount[to]) { require( amount + balanceOf(to) <= maxWallet, "Max wallet exceeded" ); } } } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if ( canSwap && swapEnabled && !swapping && !automatedMarketMakerPairs[from] && !_isExcludedFromFees[from] && !_isExcludedFromFees[to] ) { swapping = true; swapBack(); swapping = false; } bool takeFee = !swapping; // if any account belongs to _isExcludedFromFee account then remove the fee if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } uint256 fees = 0; // only take fees on buys/sells, do not take on wallet transfers if (takeFee) { // on sell if (automatedMarketMakerPairs[to] && sellTotalFees > 0) { fees = amount.mul(sellTotalFees).div(100); tokensForTreasury += (fees * sellTreasuryFee) / sellTotalFees; } // on buy else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) { fees = amount.mul(buyTotalFees).div(100); tokensForTreasury += (fees * buyTreasuryFee) / buyTotalFees; } if (fees > 0) { super._transfer(from, address(this), fees); } amount -= fees; } super._transfer(from, to, amount); } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapRouter.WETH(); _approve(address(this), address(uniswapRouter), tokenAmount); // make the swap uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapRouter), tokenAmount); // add the liquidity uniswapRouter.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ); } function swapBack() private { uint256 contractBalance = balanceOf(address(this)); uint256 totalTokensToSwap = tokensForTreasury; bool success; if (contractBalance == 0 || totalTokensToSwap == 0) { return; } if (contractBalance > swapTokensAtAmount * 20) { contractBalance = swapTokensAtAmount * 20; } uint256 amountToSwapForETH = contractBalance; uint256 initialETHBalance = address(this).balance; swapTokensForEth(amountToSwapForETH); uint256 ethBalance = address(this).balance.sub(initialETHBalance); tokensForTreasury = 0; (success, ) = address(treasuryWallet).call{value: ethBalance}(""); } function withdrawTPS() external onlyOwner { uint256 balance = IERC20(address(this)).balanceOf(address(this)); IERC20(address(this)).transfer(msg.sender, balance); payable(msg.sender).transfer(address(this).balance); } function withdrawToken(address _token, address _to) external onlyOwner { require(_token != address(0), "_token address cannot be 0"); uint256 _contractBalance = IERC20(_token).balanceOf(address(this)); IERC20(_token).transfer(_to, _contractBalance); } function withdrawETH(address toAddr) external onlyOwner { (bool success, ) = toAddr.call{ value: address(this).balance } (""); require(success); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapRouter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"treasuryWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blacklistRenounced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasuryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTreasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toAddr","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a0604052600b805463ffffffff1916600117905534801561001f575f5ffd5b506040518060400160405280600d81526020016c11985a5c88141c9bdd1bd8dbdb609a1b815250604051806040016040528060048152602001632320a4a960e11b8152508160039081610072919061047a565b50600461007f828261047a565b50505061009861009361019260201b60201c565b610196565b737a250d5630b4cf539739df2c5dacb4c659f2488d6100b88160016101e7565b6001600160a01b0381166080526005806a084595161401484a0000006100df606482610548565b6008556100ed606482610548565b600a556127106100fe826005610567565b6101089190610548565b600955600d839055600c839055600f829055600e829055600780546001600160a01b0319163317905561014d6101466005546001600160a01b031690565b600161025d565b61015830600161025d565b61017461016d6005546001600160a01b031690565b60016101e7565b61017f3060016101e7565b6101893382610302565b50505050610597565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6005546001600160a01b031633146102335760405162461bcd60e51b815260206004820181905260248201525f516020612f3f5f395f51905f5260448201526064015b60405180910390fd5b6001600160a01b03919091165f908152601260205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146102a45760405162461bcd60e51b815260206004820181905260248201525f516020612f3f5f395f51905f52604482015260640161022a565b6001600160a01b0382165f81815260116020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166103585760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161022a565b8060025f8282546103699190610584565b90915550506001600160a01b0382165f9081526020819052604081208054839290610395908490610584565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061040b57607f821691505b60208210810361042957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156103de57805f5260205f20601f840160051c810160208510156104545750805b601f840160051c820191505b81811015610473575f8155600101610460565b5050505050565b81516001600160401b03811115610493576104936103e3565b6104a7816104a184546103f7565b8461042f565b6020601f8211600181146104d9575f83156104c25750848201515b5f19600385901b1c1916600184901b178455610473565b5f84815260208120601f198516915b8281101561050857878501518255602094850194600190920191016104e8565b508482101561052557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b5f8261056257634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761057e5761057e610534565b92915050565b8082018082111561057e5761057e610534565b60805161296d6105d25f395f818161061e0152818161130a01528181611399015281816124ab0152818161256201526125b7015261296d5ff3fe608060405260043610610306575f3560e01c8063751039fc11610191578063bbc0c742116100dc578063d85ba06311610087578063eba4c33311610062578063eba4c333146108a8578063f2fde38b146108c7578063f8b45b05146108e6575f5ffd5b8063d85ba0631461083a578063dd62ed3e1461084f578063e2f4560514610893575f5ffd5b8063c8c8ebe4116100b7578063c8c8ebe4146107f1578063cc2ffe7c14610806578063d257b34f1461081b575f5ffd5b8063bbc0c74214610795578063c0246668146107b3578063c18bc195146107d2575f5ffd5b806395d89b411161013c578063a457c2d711610117578063a457c2d714610729578063a9059cbb14610748578063b62496f514610767575f5ffd5b806395d89b41146106e25780639a7a23d6146106f65780639e78fb4f14610715575f5ffd5b80638a8c523c1161016c5780638a8c523c146106925780638da5cb5b146106a6578063924de9b7146106c3575f5ffd5b8063751039fc146106405780637571336a14610654578063809d458d14610673575f5ffd5b806349bd5a5e116102515780636b2fb124116101fc578063715018a6116101d7578063715018a6146105da57806371fc4688146105ee578063735de9f71461060d575f5ffd5b80636b2fb124146105725780636ddd17131461058757806370a08231146105a6575f5ffd5b80635c068a8c1161022c5780635c068a8c14610529578063690d83201461053e5780636a486a8e1461055d575f5ffd5b806349bd5a5e146104ba5780634a62bb65146104d95780634fbee193146104f2575f5ffd5b806323b872dd116102b15780633aeac4e11161028c5780633aeac4e1146104445780633dc599ff146104635780634626402b14610483575f5ffd5b806323b872dd146103eb578063313ce5671461040a5780633950935114610425575f5ffd5b806313d5d4e9116102e157806313d5d4e91461039857806318160ddd146103ae578063203e727e146103cc575f5ffd5b806306fdde0314610311578063095ea7b31461033b57806310d5de531461036a575f5ffd5b3661030d57005b5f5ffd5b34801561031c575f5ffd5b506103256108fb565b6040516103329190612630565b60405180910390f35b348015610346575f5ffd5b5061035a610355366004612679565b61098b565b6040519015158152602001610332565b348015610375575f5ffd5b5061035a6103843660046126a3565b60126020525f908152604090205460ff1681565b3480156103a3575f5ffd5b506103ac6109a1565b005b3480156103b9575f5ffd5b506002545b604051908152602001610332565b3480156103d7575f5ffd5b506103ac6103e63660046126be565b610ae2565b3480156103f6575f5ffd5b5061035a6104053660046126d5565b610bea565b348015610415575f5ffd5b5060405160128152602001610332565b348015610430575f5ffd5b5061035a61043f366004612679565b610ca7565b34801561044f575f5ffd5b506103ac61045e366004612713565b610ce2565b34801561046e575f5ffd5b50600b5461035a906301000000900460ff1681565b34801561048e575f5ffd5b506007546104a2906001600160a01b031681565b6040516001600160a01b039091168152602001610332565b3480156104c5575f5ffd5b506006546104a2906001600160a01b031681565b3480156104e4575f5ffd5b50600b5461035a9060ff1681565b3480156104fd575f5ffd5b5061035a61050c3660046126a3565b6001600160a01b03165f9081526011602052604090205460ff1690565b348015610534575f5ffd5b506103be600d5481565b348015610549575f5ffd5b506103ac6105583660046126a3565b610e61565b348015610568575f5ffd5b506103be600e5481565b34801561057d575f5ffd5b506103be600f5481565b348015610592575f5ffd5b50600b5461035a9062010000900460ff1681565b3480156105b1575f5ffd5b506103be6105c03660046126a3565b6001600160a01b03165f9081526020819052604090205490565b3480156105e5575f5ffd5b506103ac610f03565b3480156105f9575f5ffd5b506103ac6106083660046126be565b610f55565b348015610618575f5ffd5b506104a27f000000000000000000000000000000000000000000000000000000000000000081565b34801561064b575f5ffd5b5061035a610fa6565b34801561065f575f5ffd5b506103ac61066e366004612757565b610fff565b34801561067e575f5ffd5b506103ac61068d3660046126a3565b611070565b34801561069d575f5ffd5b506103ac611120565b3480156106b1575f5ffd5b506005546001600160a01b03166104a2565b3480156106ce575f5ffd5b506103ac6106dd366004612783565b61117a565b3480156106ed575f5ffd5b506103256111dd565b348015610701575f5ffd5b506103ac610710366004612757565b6111ec565b348015610720575f5ffd5b506103ac6112c1565b348015610734575f5ffd5b5061035a610743366004612679565b6114eb565b348015610753575f5ffd5b5061035a610762366004612679565b61159b565b348015610772575f5ffd5b5061035a6107813660046126a3565b60136020525f908152604090205460ff1681565b3480156107a0575f5ffd5b50600b5461035a90610100900460ff1681565b3480156107be575f5ffd5b506103ac6107cd366004612757565b6115a7565b3480156107dd575f5ffd5b506103ac6107ec3660046126be565b61164c565b3480156107fc575f5ffd5b506103be60085481565b348015610811575f5ffd5b506103be60105481565b348015610826575f5ffd5b5061035a6108353660046126be565b611753565b348015610845575f5ffd5b506103be600c5481565b34801561085a575f5ffd5b506103be610869366004612713565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561089e575f5ffd5b506103be60095481565b3480156108b3575f5ffd5b506103ac6108c23660046126be565b6117a5565b3480156108d2575f5ffd5b506103ac6108e13660046126a3565b6117f6565b3480156108f1575f5ffd5b506103be600a5481565b60606003805461090a9061279e565b80601f01602080910402602001604051908101604052809291908181526020018280546109369061279e565b80156109815780601f1061095857610100808354040283529160200191610981565b820191905f5260205f20905b81548152906001019060200180831161096457829003601f168201915b5050505050905090565b5f6109973384846118c5565b5060015b92915050565b6005546001600160a01b031633146109ed5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064015b60405180910390fd5b6040516370a0823160e01b815230600482018190525f916370a0823190602401602060405180830381865afa158015610a28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4c91906127d6565b60405163a9059cbb60e01b815233600482015260248101829052909150309063a9059cbb906044016020604051808303815f875af1158015610a90573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab491906127ed565b5060405133904780156108fc02915f818181858888f19350505050158015610ade573d5f5f3e3d5ffd5b5050565b6005546001600160a01b03163314610b295760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b670de0b6b3a76400006103e8610b3e60025490565b610b4990600561281c565b610b539190612833565b610b5d9190612833565b811015610bd25760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201527f6c6f776572207468616e20302e3525000000000000000000000000000000000060648201526084016109e4565b610be481670de0b6b3a764000061281c565b60085550565b5f610bf6848484611a1c565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610c8f5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084016109e4565b610c9c85338584036118c5565b506001949350505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610997918590610cdd908690612852565b6118c5565b6005546001600160a01b03163314610d295760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b6001600160a01b038216610d7f5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016109e4565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610dc3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de791906127d6565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509084169063a9059cbb906044016020604051808303815f875af1158015610e37573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5b91906127ed565b50505050565b6005546001600160a01b03163314610ea85760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114610ef1576040519150601f19603f3d011682016040523d82523d5f602084013e610ef6565b606091505b5050905080610ade575f5ffd5b6005546001600160a01b03163314610f4a5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b610f535f6120e0565b565b6005546001600160a01b03163314610f9c5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b600d819055600c55565b6005545f906001600160a01b03163314610fef5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b50600b805460ff19169055600190565b6005546001600160a01b031633146110465760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b6001600160a01b03919091165f908152601260205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146110b75760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b6007546040516001600160a01b03918216918316907f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f635905f90a36007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111675760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b600b805462ffff00191662010100179055565b6005546001600160a01b031633146111c15760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b600b8054911515620100000262ff000019909216919091179055565b60606004805461090a9061279e565b6005546001600160a01b031633146112335760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b6006546001600160a01b03908116908316036112b75760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b657250616972730000000000000060648201526084016109e4565b610ade828261213e565b6005546001600160a01b031633146113085760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611364573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113889190612865565b6001600160a01b031663c9c65396307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114179190612865565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015611479573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149d9190612865565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691821790556114d4906001610fff565b600654610f53906001600160a01b0316600161213e565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156115845760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016109e4565b61159133858584036118c5565b5060019392505050565b5f610997338484611a1c565b6005546001600160a01b031633146115ee5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b6001600160a01b0382165f81815260116020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146116935760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b670de0b6b3a76400006103e86116a860025490565b6116b390600a61281c565b6116bd9190612833565b6116c79190612833565b81101561173b5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060448201527f312e30250000000000000000000000000000000000000000000000000000000060648201526084016109e4565b61174d81670de0b6b3a764000061281c565b600a5550565b6005545f906001600160a01b0316331461179c5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b50600955600190565b6005546001600160a01b031633146117ec5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b600f819055600e55565b6005546001600160a01b0316331461183d5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b6001600160a01b0381166118b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109e4565b6118c2816120e0565b50565b6001600160a01b0383166119405760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109e4565b6001600160a01b0382166119bc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016109e4565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611a805760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109e4565b6001600160a01b038216611ae25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109e4565b805f03611af957611af483835f612191565b505050565b600b5460ff1615611e79576005546001600160a01b03848116911614801590611b3057506005546001600160a01b03838116911614155b8015611b4457506001600160a01b03821615155b8015611b5a5750600654600160a01b900460ff16155b15611e7957600b54610100900460ff16611bf7576001600160a01b0383165f9081526011602052604090205460ff1680611bab57506001600160a01b0382165f9081526011602052604090205460ff165b611bf75760405162461bcd60e51b815260206004820152601660248201527f54726164696e67206973206e6f74206163746976652e0000000000000000000060448201526064016109e4565b6001600160a01b0383165f9081526013602052604090205460ff168015611c3657506001600160a01b0382165f9081526012602052604090205460ff16155b15611d2b57600854811115611cb35760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527f6d61785472616e73616374696f6e416d6f756e742e000000000000000000000060648201526084016109e4565b600a546001600160a01b0383165f90815260208190526040902054611cd89083612852565b1115611d265760405162461bcd60e51b815260206004820152601360248201527f4d61782077616c6c65742065786365656465640000000000000000000000000060448201526064016109e4565b611e79565b6001600160a01b0382165f9081526013602052604090205460ff168015611d6a57506001600160a01b0383165f9081526012602052604090205460ff16155b15611de757600854811115611d265760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d61785472616e73616374696f6e416d6f756e742e0000000000000000000060648201526084016109e4565b6001600160a01b0382165f9081526012602052604090205460ff16611e7957600a546001600160a01b0383165f90815260208190526040902054611e2b9083612852565b1115611e795760405162461bcd60e51b815260206004820152601360248201527f4d61782077616c6c65742065786365656465640000000000000000000000000060448201526064016109e4565b305f9081526020819052604090205460095481108015908190611ea45750600b5462010000900460ff165b8015611eba5750600654600160a01b900460ff16155b8015611ede57506001600160a01b0385165f9081526013602052604090205460ff16155b8015611f0257506001600160a01b0385165f9081526011602052604090205460ff16155b8015611f2657506001600160a01b0384165f9081526011602052604090205460ff16155b15611f54576006805460ff60a01b1916600160a01b179055611f46612374565b6006805460ff60a01b191690555b6006546001600160a01b0386165f9081526011602052604090205460ff600160a01b909204821615911680611fa057506001600160a01b0385165f9081526011602052604090205460ff165b15611fa857505f5b5f81156120cc576001600160a01b0386165f9081526013602052604090205460ff168015611fd757505f600e54115b1561203457611ffc6064611ff6600e548861243990919063ffffffff16565b9061244b565b9050600e54600f548261200f919061281c565b6120199190612833565b60105f8282546120299190612852565b909155506120ae9050565b6001600160a01b0387165f9081526013602052604090205460ff16801561205c57505f600c54115b156120ae5761207b6064611ff6600c548861243990919063ffffffff16565b9050600c54600d548261208e919061281c565b6120989190612833565b60105f8282546120a89190612852565b90915550505b80156120bf576120bf873083612191565b6120c98186612880565b94505b6120d7878787612191565b50505050505050565b600580546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f81815260136020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166121f55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109e4565b6001600160a01b0382166122575760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109e4565b6001600160a01b0383165f90815260208190526040902054818110156122e55760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016109e4565b6001600160a01b038085165f9081526020819052604080822085850390559185168152908120805484929061231b908490612852565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161236791815260200190565b60405180910390a3610e5b565b305f908152602081905260408120546010549091821580612393575081155b1561239d57505050565b6009546123ab90601461281c565b8311156123c3576009546123c090601461281c565b92505b82476123ce82612456565b5f6123d94783612625565b5f60108190556007546040519293506001600160a01b031691839181818185875af1925050503d805f8114612429576040519150601f19603f3d011682016040523d82523d5f602084013e61242e565b606091505b505050505050505050565b5f612444828461281c565b9392505050565b5f6124448284612833565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061248957612489612893565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612505573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125299190612865565b8160018151811061253c5761253c612893565b60200260200101906001600160a01b031690816001600160a01b031681525050612587307f0000000000000000000000000000000000000000000000000000000000000000846118c5565b6040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906125f49085905f908690309042906004016128a7565b5f604051808303815f87803b15801561260b575f5ffd5b505af115801561261d573d5f5f3e3d5ffd5b505050505050565b5f6124448284612880565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b03811681146118c2575f5ffd5b5f5f6040838503121561268a575f5ffd5b823561269581612665565b946020939093013593505050565b5f602082840312156126b3575f5ffd5b813561244481612665565b5f602082840312156126ce575f5ffd5b5035919050565b5f5f5f606084860312156126e7575f5ffd5b83356126f281612665565b9250602084013561270281612665565b929592945050506040919091013590565b5f5f60408385031215612724575f5ffd5b823561272f81612665565b9150602083013561273f81612665565b809150509250929050565b80151581146118c2575f5ffd5b5f5f60408385031215612768575f5ffd5b823561277381612665565b9150602083013561273f8161274a565b5f60208284031215612793575f5ffd5b81356124448161274a565b600181811c908216806127b257607f821691505b6020821081036127d057634e487b7160e01b5f52602260045260245ffd5b50919050565b5f602082840312156127e6575f5ffd5b5051919050565b5f602082840312156127fd575f5ffd5b81516124448161274a565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761099b5761099b612808565b5f8261284d57634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111561099b5761099b612808565b5f60208284031215612875575f5ffd5b815161244481612665565b8181038181111561099b5761099b612808565b634e487b7160e01b5f52603260045260245ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156128f75783516001600160a01b03168352602093840193909201916001016128d0565b50506001600160a01b03959095166060840152505060800152939250505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212206675acce7568cd03a95ac7ae8d6e47e1218c891adeeff4afd7495393d69930e464736f6c634300081c00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572
Deployed Bytecode
0x608060405260043610610306575f3560e01c8063751039fc11610191578063bbc0c742116100dc578063d85ba06311610087578063eba4c33311610062578063eba4c333146108a8578063f2fde38b146108c7578063f8b45b05146108e6575f5ffd5b8063d85ba0631461083a578063dd62ed3e1461084f578063e2f4560514610893575f5ffd5b8063c8c8ebe4116100b7578063c8c8ebe4146107f1578063cc2ffe7c14610806578063d257b34f1461081b575f5ffd5b8063bbc0c74214610795578063c0246668146107b3578063c18bc195146107d2575f5ffd5b806395d89b411161013c578063a457c2d711610117578063a457c2d714610729578063a9059cbb14610748578063b62496f514610767575f5ffd5b806395d89b41146106e25780639a7a23d6146106f65780639e78fb4f14610715575f5ffd5b80638a8c523c1161016c5780638a8c523c146106925780638da5cb5b146106a6578063924de9b7146106c3575f5ffd5b8063751039fc146106405780637571336a14610654578063809d458d14610673575f5ffd5b806349bd5a5e116102515780636b2fb124116101fc578063715018a6116101d7578063715018a6146105da57806371fc4688146105ee578063735de9f71461060d575f5ffd5b80636b2fb124146105725780636ddd17131461058757806370a08231146105a6575f5ffd5b80635c068a8c1161022c5780635c068a8c14610529578063690d83201461053e5780636a486a8e1461055d575f5ffd5b806349bd5a5e146104ba5780634a62bb65146104d95780634fbee193146104f2575f5ffd5b806323b872dd116102b15780633aeac4e11161028c5780633aeac4e1146104445780633dc599ff146104635780634626402b14610483575f5ffd5b806323b872dd146103eb578063313ce5671461040a5780633950935114610425575f5ffd5b806313d5d4e9116102e157806313d5d4e91461039857806318160ddd146103ae578063203e727e146103cc575f5ffd5b806306fdde0314610311578063095ea7b31461033b57806310d5de531461036a575f5ffd5b3661030d57005b5f5ffd5b34801561031c575f5ffd5b506103256108fb565b6040516103329190612630565b60405180910390f35b348015610346575f5ffd5b5061035a610355366004612679565b61098b565b6040519015158152602001610332565b348015610375575f5ffd5b5061035a6103843660046126a3565b60126020525f908152604090205460ff1681565b3480156103a3575f5ffd5b506103ac6109a1565b005b3480156103b9575f5ffd5b506002545b604051908152602001610332565b3480156103d7575f5ffd5b506103ac6103e63660046126be565b610ae2565b3480156103f6575f5ffd5b5061035a6104053660046126d5565b610bea565b348015610415575f5ffd5b5060405160128152602001610332565b348015610430575f5ffd5b5061035a61043f366004612679565b610ca7565b34801561044f575f5ffd5b506103ac61045e366004612713565b610ce2565b34801561046e575f5ffd5b50600b5461035a906301000000900460ff1681565b34801561048e575f5ffd5b506007546104a2906001600160a01b031681565b6040516001600160a01b039091168152602001610332565b3480156104c5575f5ffd5b506006546104a2906001600160a01b031681565b3480156104e4575f5ffd5b50600b5461035a9060ff1681565b3480156104fd575f5ffd5b5061035a61050c3660046126a3565b6001600160a01b03165f9081526011602052604090205460ff1690565b348015610534575f5ffd5b506103be600d5481565b348015610549575f5ffd5b506103ac6105583660046126a3565b610e61565b348015610568575f5ffd5b506103be600e5481565b34801561057d575f5ffd5b506103be600f5481565b348015610592575f5ffd5b50600b5461035a9062010000900460ff1681565b3480156105b1575f5ffd5b506103be6105c03660046126a3565b6001600160a01b03165f9081526020819052604090205490565b3480156105e5575f5ffd5b506103ac610f03565b3480156105f9575f5ffd5b506103ac6106083660046126be565b610f55565b348015610618575f5ffd5b506104a27f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561064b575f5ffd5b5061035a610fa6565b34801561065f575f5ffd5b506103ac61066e366004612757565b610fff565b34801561067e575f5ffd5b506103ac61068d3660046126a3565b611070565b34801561069d575f5ffd5b506103ac611120565b3480156106b1575f5ffd5b506005546001600160a01b03166104a2565b3480156106ce575f5ffd5b506103ac6106dd366004612783565b61117a565b3480156106ed575f5ffd5b506103256111dd565b348015610701575f5ffd5b506103ac610710366004612757565b6111ec565b348015610720575f5ffd5b506103ac6112c1565b348015610734575f5ffd5b5061035a610743366004612679565b6114eb565b348015610753575f5ffd5b5061035a610762366004612679565b61159b565b348015610772575f5ffd5b5061035a6107813660046126a3565b60136020525f908152604090205460ff1681565b3480156107a0575f5ffd5b50600b5461035a90610100900460ff1681565b3480156107be575f5ffd5b506103ac6107cd366004612757565b6115a7565b3480156107dd575f5ffd5b506103ac6107ec3660046126be565b61164c565b3480156107fc575f5ffd5b506103be60085481565b348015610811575f5ffd5b506103be60105481565b348015610826575f5ffd5b5061035a6108353660046126be565b611753565b348015610845575f5ffd5b506103be600c5481565b34801561085a575f5ffd5b506103be610869366004612713565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b34801561089e575f5ffd5b506103be60095481565b3480156108b3575f5ffd5b506103ac6108c23660046126be565b6117a5565b3480156108d2575f5ffd5b506103ac6108e13660046126a3565b6117f6565b3480156108f1575f5ffd5b506103be600a5481565b60606003805461090a9061279e565b80601f01602080910402602001604051908101604052809291908181526020018280546109369061279e565b80156109815780601f1061095857610100808354040283529160200191610981565b820191905f5260205f20905b81548152906001019060200180831161096457829003601f168201915b5050505050905090565b5f6109973384846118c5565b5060015b92915050565b6005546001600160a01b031633146109ed5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064015b60405180910390fd5b6040516370a0823160e01b815230600482018190525f916370a0823190602401602060405180830381865afa158015610a28573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4c91906127d6565b60405163a9059cbb60e01b815233600482015260248101829052909150309063a9059cbb906044016020604051808303815f875af1158015610a90573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab491906127ed565b5060405133904780156108fc02915f818181858888f19350505050158015610ade573d5f5f3e3d5ffd5b5050565b6005546001600160a01b03163314610b295760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b670de0b6b3a76400006103e8610b3e60025490565b610b4990600561281c565b610b539190612833565b610b5d9190612833565b811015610bd25760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201527f6c6f776572207468616e20302e3525000000000000000000000000000000000060648201526084016109e4565b610be481670de0b6b3a764000061281c565b60085550565b5f610bf6848484611a1c565b6001600160a01b0384165f90815260016020908152604080832033845290915290205482811015610c8f5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084016109e4565b610c9c85338584036118c5565b506001949350505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610997918590610cdd908690612852565b6118c5565b6005546001600160a01b03163314610d295760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b6001600160a01b038216610d7f5760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f74206265203000000000000060448201526064016109e4565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015610dc3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de791906127d6565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509084169063a9059cbb906044016020604051808303815f875af1158015610e37573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5b91906127ed565b50505050565b6005546001600160a01b03163314610ea85760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114610ef1576040519150601f19603f3d011682016040523d82523d5f602084013e610ef6565b606091505b5050905080610ade575f5ffd5b6005546001600160a01b03163314610f4a5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b610f535f6120e0565b565b6005546001600160a01b03163314610f9c5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b600d819055600c55565b6005545f906001600160a01b03163314610fef5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b50600b805460ff19169055600190565b6005546001600160a01b031633146110465760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b6001600160a01b03919091165f908152601260205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146110b75760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b6007546040516001600160a01b03918216918316907f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f635905f90a36007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111675760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b600b805462ffff00191662010100179055565b6005546001600160a01b031633146111c15760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b600b8054911515620100000262ff000019909216919091179055565b60606004805461090a9061279e565b6005546001600160a01b031633146112335760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b6006546001600160a01b03908116908316036112b75760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b657250616972730000000000000060648201526084016109e4565b610ade828261213e565b6005546001600160a01b031633146113085760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611364573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113889190612865565b6001600160a01b031663c9c65396307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114179190612865565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015611479573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149d9190612865565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691821790556114d4906001610fff565b600654610f53906001600160a01b0316600161213e565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156115845760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016109e4565b61159133858584036118c5565b5060019392505050565b5f610997338484611a1c565b6005546001600160a01b031633146115ee5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b6001600160a01b0382165f81815260116020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146116935760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b670de0b6b3a76400006103e86116a860025490565b6116b390600a61281c565b6116bd9190612833565b6116c79190612833565b81101561173b5760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060448201527f312e30250000000000000000000000000000000000000000000000000000000060648201526084016109e4565b61174d81670de0b6b3a764000061281c565b600a5550565b6005545f906001600160a01b0316331461179c5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b50600955600190565b6005546001600160a01b031633146117ec5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b600f819055600e55565b6005546001600160a01b0316331461183d5760405162461bcd60e51b815260206004820181905260248201525f5160206129185f395f51905f5260448201526064016109e4565b6001600160a01b0381166118b95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109e4565b6118c2816120e0565b50565b6001600160a01b0383166119405760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109e4565b6001600160a01b0382166119bc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016109e4565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316611a805760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109e4565b6001600160a01b038216611ae25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109e4565b805f03611af957611af483835f612191565b505050565b600b5460ff1615611e79576005546001600160a01b03848116911614801590611b3057506005546001600160a01b03838116911614155b8015611b4457506001600160a01b03821615155b8015611b5a5750600654600160a01b900460ff16155b15611e7957600b54610100900460ff16611bf7576001600160a01b0383165f9081526011602052604090205460ff1680611bab57506001600160a01b0382165f9081526011602052604090205460ff165b611bf75760405162461bcd60e51b815260206004820152601660248201527f54726164696e67206973206e6f74206163746976652e0000000000000000000060448201526064016109e4565b6001600160a01b0383165f9081526013602052604090205460ff168015611c3657506001600160a01b0382165f9081526012602052604090205460ff16155b15611d2b57600854811115611cb35760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527f6d61785472616e73616374696f6e416d6f756e742e000000000000000000000060648201526084016109e4565b600a546001600160a01b0383165f90815260208190526040902054611cd89083612852565b1115611d265760405162461bcd60e51b815260206004820152601360248201527f4d61782077616c6c65742065786365656465640000000000000000000000000060448201526064016109e4565b611e79565b6001600160a01b0382165f9081526013602052604090205460ff168015611d6a57506001600160a01b0383165f9081526012602052604090205460ff16155b15611de757600854811115611d265760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560448201527f206d61785472616e73616374696f6e416d6f756e742e0000000000000000000060648201526084016109e4565b6001600160a01b0382165f9081526012602052604090205460ff16611e7957600a546001600160a01b0383165f90815260208190526040902054611e2b9083612852565b1115611e795760405162461bcd60e51b815260206004820152601360248201527f4d61782077616c6c65742065786365656465640000000000000000000000000060448201526064016109e4565b305f9081526020819052604090205460095481108015908190611ea45750600b5462010000900460ff165b8015611eba5750600654600160a01b900460ff16155b8015611ede57506001600160a01b0385165f9081526013602052604090205460ff16155b8015611f0257506001600160a01b0385165f9081526011602052604090205460ff16155b8015611f2657506001600160a01b0384165f9081526011602052604090205460ff16155b15611f54576006805460ff60a01b1916600160a01b179055611f46612374565b6006805460ff60a01b191690555b6006546001600160a01b0386165f9081526011602052604090205460ff600160a01b909204821615911680611fa057506001600160a01b0385165f9081526011602052604090205460ff165b15611fa857505f5b5f81156120cc576001600160a01b0386165f9081526013602052604090205460ff168015611fd757505f600e54115b1561203457611ffc6064611ff6600e548861243990919063ffffffff16565b9061244b565b9050600e54600f548261200f919061281c565b6120199190612833565b60105f8282546120299190612852565b909155506120ae9050565b6001600160a01b0387165f9081526013602052604090205460ff16801561205c57505f600c54115b156120ae5761207b6064611ff6600c548861243990919063ffffffff16565b9050600c54600d548261208e919061281c565b6120989190612833565b60105f8282546120a89190612852565b90915550505b80156120bf576120bf873083612191565b6120c98186612880565b94505b6120d7878787612191565b50505050505050565b600580546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f81815260136020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b0383166121f55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016109e4565b6001600160a01b0382166122575760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016109e4565b6001600160a01b0383165f90815260208190526040902054818110156122e55760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016109e4565b6001600160a01b038085165f9081526020819052604080822085850390559185168152908120805484929061231b908490612852565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161236791815260200190565b60405180910390a3610e5b565b305f908152602081905260408120546010549091821580612393575081155b1561239d57505050565b6009546123ab90601461281c565b8311156123c3576009546123c090601461281c565b92505b82476123ce82612456565b5f6123d94783612625565b5f60108190556007546040519293506001600160a01b031691839181818185875af1925050503d805f8114612429576040519150601f19603f3d011682016040523d82523d5f602084013e61242e565b606091505b505050505050505050565b5f612444828461281c565b9392505050565b5f6124448284612833565b6040805160028082526060820183525f9260208301908036833701905050905030815f8151811061248957612489612893565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612505573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125299190612865565b8160018151811061253c5761253c612893565b60200260200101906001600160a01b031690816001600160a01b031681525050612587307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846118c5565b6040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906125f49085905f908690309042906004016128a7565b5f604051808303815f87803b15801561260b575f5ffd5b505af115801561261d573d5f5f3e3d5ffd5b505050505050565b5f6124448284612880565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b03811681146118c2575f5ffd5b5f5f6040838503121561268a575f5ffd5b823561269581612665565b946020939093013593505050565b5f602082840312156126b3575f5ffd5b813561244481612665565b5f602082840312156126ce575f5ffd5b5035919050565b5f5f5f606084860312156126e7575f5ffd5b83356126f281612665565b9250602084013561270281612665565b929592945050506040919091013590565b5f5f60408385031215612724575f5ffd5b823561272f81612665565b9150602083013561273f81612665565b809150509250929050565b80151581146118c2575f5ffd5b5f5f60408385031215612768575f5ffd5b823561277381612665565b9150602083013561273f8161274a565b5f60208284031215612793575f5ffd5b81356124448161274a565b600181811c908216806127b257607f821691505b6020821081036127d057634e487b7160e01b5f52602260045260245ffd5b50919050565b5f602082840312156127e6575f5ffd5b5051919050565b5f602082840312156127fd575f5ffd5b81516124448161274a565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761099b5761099b612808565b5f8261284d57634e487b7160e01b5f52601260045260245ffd5b500490565b8082018082111561099b5761099b612808565b5f60208284031215612875575f5ffd5b815161244481612665565b8181038181111561099b5761099b612808565b634e487b7160e01b5f52603260045260245ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156128f75783516001600160a01b03168352602093840193909201916001016128d0565b50506001600160a01b03959095166060840152505060800152939250505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212206675acce7568cd03a95ac7ae8d6e47e1218c891adeeff4afd7495393d69930e464736f6c634300081c0033
Deployed Bytecode Sourcemap
27992:11810:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15491:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17658:169;;;;;;;;;;-1:-1:-1;17658:169:0;;;;;:::i;:::-;;:::i;:::-;;;1133:14:1;;1126:22;1108:41;;1096:2;1081:18;17658:169:0;968:187:1;28818:63:0;;;;;;;;;;-1:-1:-1;28818:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39058:249;;;;;;;;;;;;;:::i;:::-;;16611:108;;;;;;;;;;-1:-1:-1;16699:12:0;;16611:108;;;1558:25:1;;;1546:2;1531:18;16611:108:0;1412:177:1;31300:275:0;;;;;;;;;;-1:-1:-1;31300:275:0;;;;;:::i;:::-;;:::i;18309:492::-;;;;;;;;;;-1:-1:-1;18309:492:0;;;;;:::i;:::-;;:::i;16453:93::-;;;;;;;;;;-1:-1:-1;16453:93:0;;16536:2;2480:36:1;;2468:2;2453:18;16453:93:0;2338:184:1;19210:215:0;;;;;;;;;;-1:-1:-1;19210:215:0;;;;;:::i;:::-;;:::i;39315:283::-;;;;;;;;;;-1:-1:-1;39315:283:0;;;;;:::i;:::-;;:::i;28470:38::-;;;;;;;;;;-1:-1:-1;28470:38:0;;;;;;;;;;;28197:29;;;;;;;;;;-1:-1:-1;28197:29:0;;;;-1:-1:-1;;;;;28197:29:0;;;;;;-1:-1:-1;;;;;3084:55:1;;;3066:74;;3054:2;3039:18;28197:29:0;2920:226:1;28130:28:0;;;;;;;;;;-1:-1:-1;28130:28:0;;;;-1:-1:-1;;;;;28130:28:0;;;28350:33;;;;;;;;;;-1:-1:-1;28350:33:0;;;;;;;;33458:126;;;;;;;;;;-1:-1:-1;33458:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;33548:28:0;33524:4;33548:28;;;:19;:28;;;;;;;;;33458:126;28551:29;;;;;;;;;;;;;;;;39606:191;;;;;;;;;;-1:-1:-1;39606:191:0;;;;;:::i;:::-;;:::i;28589:28::-;;;;;;;;;;;;;;;;28624:30;;;;;;;;;;;;;;;;28430:31;;;;;;;;;;-1:-1:-1;28430:31:0;;;;;;;;;;;16782:127;;;;;;;;;;-1:-1:-1;16782:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;16883:18:0;16856:7;16883:18;;;;;;;;;;;;16782:127;27126:103;;;;;;;;;;;;;:::i;32219:168::-;;;;;;;;;;-1:-1:-1;32219:168:0;;;;;:::i;:::-;;:::i;28074:49::-;;;;;;;;;;;;;;;30911:121;;;;;;;;;;;;;:::i;31848:167::-;;;;;;;;;;-1:-1:-1;31848:167:0;;;;;:::i;:::-;;:::i;33273:177::-;;;;;;;;;;-1:-1:-1;33273:177:0;;;;;:::i;:::-;;:::i;30747:112::-;;;;;;;;;;;;;:::i;26475:87::-;;;;;;;;;;-1:-1:-1;26548:6:0;;-1:-1:-1;;;;;26548:6:0;26475:87;;32111:100;;;;;;;;;;-1:-1:-1;32111:100:0;;;;;:::i;:::-;;:::i;15710:104::-;;;;;;;;;;;;;:::i;32765:304::-;;;;;;;;;;-1:-1:-1;32765:304:0;;;;;:::i;:::-;;:::i;30424:315::-;;;;;;;;;;;;;:::i;19928:413::-;;;;;;;;;;-1:-1:-1;19928:413:0;;;;;:::i;:::-;;:::i;17122:175::-;;;;;;;;;;-1:-1:-1;17122:175:0;;;;;:::i;:::-;;:::i;28890:57::-;;;;;;;;;;-1:-1:-1;28890:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28390:33;;;;;;;;;;-1:-1:-1;28390:33:0;;;;;;;;;;;32575:182;;;;;;;;;;-1:-1:-1;32575:182:0;;;;;:::i;:::-;;:::i;31583:257::-;;;;;;;;;;-1:-1:-1;31583:257:0;;;;;:::i;:::-;;:::i;28235:35::-;;;;;;;;;;;;;;;;28663:32;;;;;;;;;;;;;;;;31102:190;;;;;;;;;;-1:-1:-1;31102:190:0;;;;;:::i;:::-;;:::i;28517:27::-;;;;;;;;;;;;;;;;17360:151;;;;;;;;;;-1:-1:-1;17360:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;17476:18:0;;;17449:7;17476:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17360:151;28277:33;;;;;;;;;;;;;;;;32395:172;;;;;;;;;;-1:-1:-1;32395:172:0;;;;;:::i;:::-;;:::i;27384:201::-;;;;;;;;;;-1:-1:-1;27384:201:0;;;;;:::i;:::-;;:::i;28317:24::-;;;;;;;;;;;;;;;;15491:100;15545:13;15578:5;15571:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15491:100;:::o;17658:169::-;17741:4;17758:39;13344:10;17781:7;17790:6;17758:8;:39::i;:::-;-1:-1:-1;17815:4:0;17658:169;;;;;:::o;39058:249::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;;;;;;;;;39129:46:::1;::::0;-1:-1:-1;;;39129:46:0;;39144:4:::1;39129:46;::::0;::::1;3066:74:1::0;;;39111:15:0::1;::::0;39129:31:::1;::::0;3039:18:1;;39129:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39186:51;::::0;-1:-1:-1;;;39186:51:0;;39217:10:::1;39186:51;::::0;::::1;5329:74:1::0;5419:18;;;5412:34;;;39111:64:0;;-1:-1:-1;39201:4:0::1;::::0;39186:30:::1;::::0;5302:18:1;;39186:51:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;39248:51:0::1;::::0;39256:10:::1;::::0;39277:21:::1;39248:51:::0;::::1;;;::::0;::::1;::::0;;;39277:21;39256:10;39248:51;::::1;;;;;;;;;;;;;;;;;;;;39100:207;39058:249::o:0;31300:275::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;31437:4:::1;31429;31408:13;16699:12:::0;;;16611:108;31408:13:::1;:17;::::0;31424:1:::1;31408:17;:::i;:::-;31407:26;;;;:::i;:::-;31406:35;;;;:::i;:::-;31396:6;:45;;31374:142;;;::::0;-1:-1:-1;;;31374:142:0;;6550:2:1;31374:142:0::1;::::0;::::1;6532:21:1::0;6589:2;6569:18;;;6562:30;6628:34;6608:18;;;6601:62;6699:17;6679:18;;;6672:45;6734:19;;31374:142:0::1;6348:411:1::0;31374:142:0::1;31550:17;:6:::0;31560::::1;31550:17;:::i;:::-;31527:20;:40:::0;-1:-1:-1;31300:275:0:o;18309:492::-;18449:4;18466:36;18476:6;18484:9;18495:6;18466:9;:36::i;:::-;-1:-1:-1;;;;;18542:19:0;;18515:24;18542:19;;;:11;:19;;;;;;;;13344:10;18542:33;;;;;;;;18594:26;;;;18586:79;;;;-1:-1:-1;;;18586:79:0;;6966:2:1;18586:79:0;;;6948:21:1;7005:2;6985:18;;;6978:30;7044:34;7024:18;;;7017:62;7115:10;7095:18;;;7088:38;7143:19;;18586:79:0;6764:404:1;18586:79:0;18701:57;18710:6;13344:10;18751:6;18732:16;:25;18701:8;:57::i;:::-;-1:-1:-1;18789:4:0;;18309:492;-1:-1:-1;;;;18309:492:0:o;19210:215::-;13344:10;19298:4;19347:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19347:34:0;;;;;;;;;;19298:4;;19315:80;;19338:7;;19347:47;;19384:10;;19347:47;:::i;:::-;19315:8;:80::i;39315:283::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;-1:-1:-1;;;;;39405:20:0;::::1;39397:59;;;::::0;-1:-1:-1;;;39397:59:0;;7505:2:1;39397:59:0::1;::::0;::::1;7487:21:1::0;7544:2;7524:18;;;7517:30;7583:28;7563:18;;;7556:56;7629:18;;39397:59:0::1;7303:350:1::0;39397:59:0::1;39494:39;::::0;-1:-1:-1;;;39494:39:0;;39527:4:::1;39494:39;::::0;::::1;3066:74:1::0;39467:24:0::1;::::0;-1:-1:-1;;;;;39494:24:0;::::1;::::0;::::1;::::0;3039:18:1;;39494:39:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39544:46;::::0;-1:-1:-1;;;39544:46:0;;-1:-1:-1;;;;;5347:55:1;;;39544:46:0::1;::::0;::::1;5329:74:1::0;5419:18;;;5412:34;;;39467:66:0;;-1:-1:-1;39544:23:0;;::::1;::::0;::::1;::::0;5302:18:1;;39544:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39386:212;39315:283:::0;;:::o;39606:191::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;39674:12:::1;39692:6;-1:-1:-1::0;;;;;39692:11:0::1;39725:21;39692:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39673:89;;;39781:7;39773:16;;;;;27126:103:::0;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;27191:30:::1;27218:1;27191:18;:30::i;:::-;27126:103::o:0;32219:168::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;32310:14:::1;:29:::0;;;32350:12:::1;:29:::0;32219:168::o;30911:121::-;26548:6;;30963:4;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;-1:-1:-1;30980:14:0::1;:22:::0;;-1:-1:-1;;30980:22:0::1;::::0;;;30911:121;:::o;31848:167::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;-1:-1:-1;;;;;31961:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;31961:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31848:167::o;33273:177::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;33390:14:::1;::::0;33357:48:::1;::::0;-1:-1:-1;;;;;33390:14:0;;::::1;::::0;33357:48;::::1;::::0;::::1;::::0;33390:14:::1;::::0;33357:48:::1;33416:14;:26:::0;;-1:-1:-1;;33416:26:0::1;-1:-1:-1::0;;;;;33416:26:0;;;::::1;::::0;;;::::1;::::0;;33273:177::o;30747:112::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;30802:13:::1;:20:::0;;-1:-1:-1;;30833:18:0;;;;;30747:112::o;32111:100::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;32182:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;32182:21:0;;::::1;::::0;;;::::1;::::0;;32111:100::o;15710:104::-;15766:13;15799:7;15792:14;;;;;:::i;32765:304::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;32909:13:::1;::::0;-1:-1:-1;;;;;32909:13:0;;::::1;32901:21:::0;;::::1;::::0;32879:128:::1;;;::::0;-1:-1:-1;;;32879:128:0;;8070:2:1;32879:128:0::1;::::0;::::1;8052:21:1::0;8109:2;8089:18;;;8082:30;8148:34;8128:18;;;8121:62;8219:27;8199:18;;;8192:55;8264:19;;32879:128:0::1;7868:421:1::0;32879:128:0::1;33020:41;33049:4;33055:5;33020:28;:41::i;30424:315::-:0;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;30510:13:::1;-1:-1:-1::0;;;;;30510:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30492:67:0::1;;30568:4;30575:13;-1:-1:-1::0;;;;;30575:18:0::1;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30492:104;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;8742:55:1;;;30492:104:0::1;::::0;::::1;8724:74:1::0;8834:55;;8814:18;;;8807:83;8697:18;;30492:104:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30476:13;:120:::0;;-1:-1:-1;;30476:120:0::1;-1:-1:-1::0;;;;;30476:120:0;;;::::1;::::0;;::::1;::::0;;30607:55:::1;::::0;-1:-1:-1;30607:25:0::1;:55::i;:::-;30710:13;::::0;30673:58:::1;::::0;-1:-1:-1;;;;;30710:13:0::1;::::0;30673:28:::1;:58::i;19928:413::-:0;13344:10;20021:4;20065:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20065:34:0;;;;;;;;;;20118:35;;;;20110:85;;;;-1:-1:-1;;;20110:85:0;;9103:2:1;20110:85:0;;;9085:21:1;9142:2;9122:18;;;9115:30;9181:34;9161:18;;;9154:62;9252:7;9232:18;;;9225:35;9277:19;;20110:85:0;8901:401:1;20110:85:0;20231:67;13344:10;20254:7;20282:15;20263:16;:34;20231:8;:67::i;:::-;-1:-1:-1;20329:4:0;;19928:413;-1:-1:-1;;;19928:413:0:o;17122:175::-;17208:4;17225:42;13344:10;17249:9;17260:6;17225:9;:42::i;32575:182::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;-1:-1:-1;;;;;32660:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;32660:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;32715:34;;1108:41:1;;;32715:34:0::1;::::0;1081:18:1;32715:34:0::1;;;;;;;32575:182:::0;;:::o;31583:257::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;31724:4:::1;31716;31694:13;16699:12:::0;;;16611:108;31694:13:::1;:18;::::0;31710:2:::1;31694:18;:::i;:::-;31693:27;;;;:::i;:::-;31692:36;;;;:::i;:::-;31682:6;:46;;31660:132;;;::::0;-1:-1:-1;;;31660:132:0;;9509:2:1;31660:132:0::1;::::0;::::1;9491:21:1::0;9548:2;9528:18;;;9521:30;9587:34;9567:18;;;9560:62;9658:6;9638:18;;;9631:34;9682:19;;31660:132:0::1;9307:400:1::0;31660:132:0::1;31815:17;:6:::0;31825::::1;31815:17;:::i;:::-;31803:9;:29:::0;-1:-1:-1;31583:257:0:o;31102:190::-;26548:6;;31210:4;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;-1:-1:-1;31232:18:0::1;:30:::0;31280:4:::1;::::0;31102:190::o;32395:172::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;32487:15:::1;:30:::0;;;32528:13:::1;:31:::0;32395:172::o;27384:201::-;26548:6;;-1:-1:-1;;;;;26548:6:0;13344:10;26695:23;26687:68;;;;-1:-1:-1;;;26687:68:0;;4807:2:1;26687:68:0;;;4789:21:1;;;4826:18;;;4819:30;-1:-1:-1;;;;;;;;;;;4865:18:1;;;4858:62;4937:18;;26687:68:0;4605:356:1;26687:68:0;-1:-1:-1;;;;;27473:22:0;::::1;27465:73;;;::::0;-1:-1:-1;;;27465:73:0;;9914:2:1;27465:73:0::1;::::0;::::1;9896:21:1::0;9953:2;9933:18;;;9926:30;9992:34;9972:18;;;9965:62;10063:8;10043:18;;;10036:36;10089:19;;27465:73:0::1;9712:402:1::0;27465:73:0::1;27549:28;27568:8;27549:18;:28::i;:::-;27384:201:::0;:::o;23612:380::-;-1:-1:-1;;;;;23748:19:0;;23740:68;;;;-1:-1:-1;;;23740:68:0;;10321:2:1;23740:68:0;;;10303:21:1;10360:2;10340:18;;;10333:30;10399:34;10379:18;;;10372:62;10470:6;10450:18;;;10443:34;10494:19;;23740:68:0;10119:400:1;23740:68:0;-1:-1:-1;;;;;23827:21:0;;23819:68;;;;-1:-1:-1;;;23819:68:0;;10726:2:1;23819:68:0;;;10708:21:1;10765:2;10745:18;;;10738:30;10804:34;10784:18;;;10777:62;10875:4;10855:18;;;10848:32;10897:19;;23819:68:0;10524:398:1;23819:68:0;-1:-1:-1;;;;;23900:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23952:32;;1558:25:1;;;23952:32:0;;1531:18:1;23952:32:0;;;;;;;23612:380;;;:::o;33592:3578::-;-1:-1:-1;;;;;33724:18:0;;33716:68;;;;-1:-1:-1;;;33716:68:0;;11129:2:1;33716:68:0;;;11111:21:1;11168:2;11148:18;;;11141:30;11207:34;11187:18;;;11180:62;-1:-1:-1;;;11258:18:1;;;11251:35;11303:19;;33716:68:0;10927:401:1;33716:68:0;-1:-1:-1;;;;;33803:16:0;;33795:64;;;;-1:-1:-1;;;33795:64:0;;11535:2:1;33795:64:0;;;11517:21:1;11574:2;11554:18;;;11547:30;11613:34;11593:18;;;11586:62;-1:-1:-1;;;11664:18:1;;;11657:33;11707:19;;33795:64:0;11333:399:1;33795:64:0;33876:6;33886:1;33876:11;33872:93;;33904:28;33920:4;33926:2;33930:1;33904:15;:28::i;:::-;33592:3578;;;:::o;33872:93::-;33981:14;;;;33977:1652;;;26548:6;;-1:-1:-1;;;;;34034:15:0;;;26548:6;;34034:15;;;;:49;;-1:-1:-1;26548:6:0;;-1:-1:-1;;;;;34070:13:0;;;26548:6;;34070:13;;34034:49;:86;;;;-1:-1:-1;;;;;;34104:16:0;;;;34034:86;:116;;;;-1:-1:-1;34142:8:0;;-1:-1:-1;;;34142:8:0;;;;34141:9;34034:116;34012:1606;;;34190:13;;;;;;;34185:223;;-1:-1:-1;;;;;34262:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;34291:23:0;;;;;;:19;:23;;;;;;;;34262:52;34228:160;;;;-1:-1:-1;;;34228:160:0;;11939:2:1;34228:160:0;;;11921:21:1;11978:2;11958:18;;;11951:30;12017:24;11997:18;;;11990:52;12059:18;;34228:160:0;11737:346:1;34228:160:0;-1:-1:-1;;;;;34482:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;34539:35:0;;;;;;:31;:35;;;;;;;;34538:36;34482:92;34456:1147;;;34661:20;;34651:6;:30;;34617:169;;;;-1:-1:-1;;;34617:169:0;;12290:2:1;34617:169:0;;;12272:21:1;12329:2;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12439:23;12419:18;;;12412:51;12480:19;;34617:169:0;12088:417:1;34617:169:0;34869:9;;-1:-1:-1;;;;;16883:18:0;;16856:7;16883:18;;;;;;;;;;;34843:22;;:6;:22;:::i;:::-;:35;;34809:140;;;;-1:-1:-1;;;34809:140:0;;12712:2:1;34809:140:0;;;12694:21:1;12751:2;12731:18;;;12724:30;12790:21;12770:18;;;12763:49;12829:18;;34809:140:0;12510:343:1;34809:140:0;34456:1147;;;-1:-1:-1;;;;;35047:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;35102:37:0;;;;;;:31;:37;;;;;;;;35101:38;35047:92;35021:582;;;35226:20;;35216:6;:30;;35182:170;;;;-1:-1:-1;;;35182:170:0;;13060:2:1;35182:170:0;;;13042:21:1;13099:2;13079:18;;;13072:30;13138:34;13118:18;;;13111:62;13209:24;13189:18;;;13182:52;13251:19;;35182:170:0;12858:418:1;35021:582:0;-1:-1:-1;;;;;35383:35:0;;;;;;:31;:35;;;;;;;;35378:225;;35503:9;;-1:-1:-1;;;;;16883:18:0;;16856:7;16883:18;;;;;;;;;;;35477:22;;:6;:22;:::i;:::-;:35;;35443:140;;;;-1:-1:-1;;;35443:140:0;;12712:2:1;35443:140:0;;;12694:21:1;12751:2;12731:18;;;12724:30;12790:21;12770:18;;;12763:49;12829:18;;35443:140:0;12510:343:1;35443:140:0;35690:4;35641:28;16883:18;;;;;;;;;;;35748;;35724:42;;;;;;;35797:35;;-1:-1:-1;35821:11:0;;;;;;;35797:35;:61;;;;-1:-1:-1;35850:8:0;;-1:-1:-1;;;35850:8:0;;;;35849:9;35797:61;:110;;;;-1:-1:-1;;;;;;35876:31:0;;;;;;:25;:31;;;;;;;;35875:32;35797:110;:153;;;;-1:-1:-1;;;;;;35925:25:0;;;;;;:19;:25;;;;;;;;35924:26;35797:153;:194;;;;-1:-1:-1;;;;;;35968:23:0;;;;;;:19;:23;;;;;;;;35967:24;35797:194;35779:326;;;36018:8;:15;;-1:-1:-1;;;;36018:15:0;-1:-1:-1;;;36018:15:0;;;36050:10;:8;:10::i;:::-;36077:8;:16;;-1:-1:-1;;;;36077:16:0;;;35779:326;36133:8;;-1:-1:-1;;;;;36243:25:0;;36117:12;36243:25;;;:19;:25;;;;;;36133:8;-1:-1:-1;;;36133:8:0;;;;;36132:9;;36243:25;;:52;;-1:-1:-1;;;;;;36272:23:0;;;;;;:19;:23;;;;;;;;36243:52;36239:100;;;-1:-1:-1;36322:5:0;36239:100;36351:12;36452:665;;;;-1:-1:-1;;;;;36508:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;36557:1;36541:13;;:17;36508:50;36504:464;;;36586:34;36616:3;36586:25;36597:13;;36586:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;36579:41;;36687:13;;36668:15;;36661:4;:22;;;;:::i;:::-;36660:40;;;;:::i;:::-;36639:17;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;36504:464:0;;-1:-1:-1;36504:464:0;;-1:-1:-1;;;;;36762:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;36812:1;36797:12;;:16;36762:51;36758:210;;;36841:33;36870:3;36841:24;36852:12;;36841:6;:10;;:24;;;;:::i;:33::-;36834:40;;36940:12;;36922:14;;36915:4;:21;;;;:::i;:::-;36914:38;;;;:::i;:::-;36893:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;36758:210:0;36988:8;;36984:91;;37017:42;37033:4;37047;37054;37017:15;:42::i;:::-;37091:14;37101:4;37091:14;;:::i;:::-;;;36452:665;37129:33;37145:4;37151:2;37155:6;37129:15;:33::i;:::-;33705:3465;;;;33592:3578;;;:::o;27745:191::-;27838:6;;;-1:-1:-1;;;;;27855:17:0;;;-1:-1:-1;;27855:17:0;;;;;;;27888:40;;27838:6;;;27855:17;27838:6;;27888:40;;27819:16;;27888:40;27808:128;27745:191;:::o;33077:188::-;-1:-1:-1;;;;;33160:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;33160:39:0;;;;;;;;;;33217:40;;33160:39;;:31;33217:40;;;33077:188;;:::o;20831:733::-;-1:-1:-1;;;;;20971:20:0;;20963:70;;;;-1:-1:-1;;;20963:70:0;;11129:2:1;20963:70:0;;;11111:21:1;11168:2;11148:18;;;11141:30;11207:34;11187:18;;;11180:62;-1:-1:-1;;;11258:18:1;;;11251:35;11303:19;;20963:70:0;10927:401:1;20963:70:0;-1:-1:-1;;;;;21052:23:0;;21044:71;;;;-1:-1:-1;;;21044:71:0;;11535:2:1;21044:71:0;;;11517:21:1;11574:2;11554:18;;;11547:30;11613:34;11593:18;;;11586:62;-1:-1:-1;;;11664:18:1;;;11657:33;11707:19;;21044:71:0;11333:399:1;21044:71:0;-1:-1:-1;;;;;21212:17:0;;21188:21;21212:17;;;;;;;;;;;21248:23;;;;21240:74;;;;-1:-1:-1;;;21240:74:0;;13616:2:1;21240:74:0;;;13598:21:1;13655:2;13635:18;;;13628:30;13694:34;13674:18;;;13667:62;13765:8;13745:18;;;13738:36;13791:19;;21240:74:0;13414:402:1;21240:74:0;-1:-1:-1;;;;;21350:17:0;;;:9;:17;;;;;;;;;;;21370:22;;;21350:42;;21414:20;;;;;;;;:30;;21386:6;;21350:9;21414:30;;21386:6;;21414:30;:::i;:::-;;;;;;;;21479:9;-1:-1:-1;;;;;21462:35:0;21471:6;-1:-1:-1;;;;;21462:35:0;;21490:6;21462:35;;;;1558:25:1;;1546:2;1531:18;;1412:177;21462:35:0;;;;;;;;21510:46;33592:3578;38290:760;38373:4;38329:23;16883:18;;;;;;;;;;;38418:17;;16883:18;;38475:20;;;:46;;-1:-1:-1;38499:22:0;;38475:46;38471:85;;;38538:7;;;38290:760::o;38471:85::-;38590:18;;:23;;38611:2;38590:23;:::i;:::-;38572:15;:41;38568:115;;;38648:18;;:23;;38669:2;38648:23;:::i;:::-;38630:41;;38568:115;38726:15;38782:21;38816:36;38726:15;38816:16;:36::i;:::-;38865:18;38886:44;:21;38912:17;38886:25;:44::i;:::-;38963:1;38943:17;:21;;;38999:14;;38991:51;;38865:65;;-1:-1:-1;;;;;;38999:14:0;;38865:65;;38991:51;38963:1;38991:51;38865:65;38999:14;38991:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;38290:760:0:o;5779:98::-;5837:7;5864:5;5868:1;5864;:5;:::i;:::-;5857:12;5779:98;-1:-1:-1;;;5779:98:0:o;6178:::-;6236:7;6263:5;6267:1;6263;:5;:::i;37178:583::-;37328:16;;;37342:1;37328:16;;;;;;;;37304:21;;37328:16;;;;;;;;;;-1:-1:-1;37328:16:0;37304:40;;37373:4;37355;37360:1;37355:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;37355:23:0;;;-1:-1:-1;;;;;37355:23:0;;;;;37399:13;-1:-1:-1;;;;;37399:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37389:4;37394:1;37389:7;;;;;;;;:::i;:::-;;;;;;:30;-1:-1:-1;;;;;37389:30:0;;;-1:-1:-1;;;;;37389:30:0;;;;;37432:60;37449:4;37464:13;37480:11;37432:8;:60::i;:::-;37531:222;;;;;-1:-1:-1;;;;;37531:13:0;:64;;;;:222;;37610:11;;37636:1;;37680:4;;37707;;37727:15;;37531:222;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37233:528;37178:583;:::o;5422:98::-;5480:7;5507:5;5511:1;5507;:5;:::i;14:418:1:-;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;437:154::-;-1:-1:-1;;;;;516:5:1;512:54;505:5;502:65;492:93;;581:1;578;571:12;596:367;664:6;672;725:2;713:9;704:7;700:23;696:32;693:52;;;741:1;738;731:12;693:52;780:9;767:23;799:31;824:5;799:31;:::i;:::-;849:5;927:2;912:18;;;;899:32;;-1:-1:-1;;;596:367:1:o;1160:247::-;1219:6;1272:2;1260:9;1251:7;1247:23;1243:32;1240:52;;;1288:1;1285;1278:12;1240:52;1327:9;1314:23;1346:31;1371:5;1346:31;:::i;1594:226::-;1653:6;1706:2;1694:9;1685:7;1681:23;1677:32;1674:52;;;1722:1;1719;1712:12;1674:52;-1:-1:-1;1767:23:1;;1594:226;-1:-1:-1;1594:226:1:o;1825:508::-;1902:6;1910;1918;1971:2;1959:9;1950:7;1946:23;1942:32;1939:52;;;1987:1;1984;1977:12;1939:52;2026:9;2013:23;2045:31;2070:5;2045:31;:::i;:::-;2095:5;-1:-1:-1;2152:2:1;2137:18;;2124:32;2165:33;2124:32;2165:33;:::i;:::-;1825:508;;2217:7;;-1:-1:-1;;;2297:2:1;2282:18;;;;2269:32;;1825:508::o;2527:388::-;2595:6;2603;2656:2;2644:9;2635:7;2631:23;2627:32;2624:52;;;2672:1;2669;2662:12;2624:52;2711:9;2698:23;2730:31;2755:5;2730:31;:::i;:::-;2780:5;-1:-1:-1;2837:2:1;2822:18;;2809:32;2850:33;2809:32;2850:33;:::i;:::-;2902:7;2892:17;;;2527:388;;;;;:::o;3407:118::-;3493:5;3486:13;3479:21;3472:5;3469:32;3459:60;;3515:1;3512;3505:12;3530:382;3595:6;3603;3656:2;3644:9;3635:7;3631:23;3627:32;3624:52;;;3672:1;3669;3662:12;3624:52;3711:9;3698:23;3730:31;3755:5;3730:31;:::i;:::-;3780:5;-1:-1:-1;3837:2:1;3822:18;;3809:32;3850:30;3809:32;3850:30;:::i;3917:241::-;3973:6;4026:2;4014:9;4005:7;4001:23;3997:32;3994:52;;;4042:1;4039;4032:12;3994:52;4081:9;4068:23;4100:28;4122:5;4100:28;:::i;4163:437::-;4242:1;4238:12;;;;4285;;;4306:61;;4360:4;4352:6;4348:17;4338:27;;4306:61;4413:2;4405:6;4402:14;4382:18;4379:38;4376:218;;-1:-1:-1;;;4447:1:1;4440:88;4551:4;4548:1;4541:15;4579:4;4576:1;4569:15;4376:218;;4163:437;;;:::o;4966:184::-;5036:6;5089:2;5077:9;5068:7;5064:23;5060:32;5057:52;;;5105:1;5102;5095:12;5057:52;-1:-1:-1;5128:16:1;;4966:184;-1:-1:-1;4966:184:1:o;5457:245::-;5524:6;5577:2;5565:9;5556:7;5552:23;5548:32;5545:52;;;5593:1;5590;5583:12;5545:52;5625:9;5619:16;5644:28;5666:5;5644:28;:::i;5707:184::-;-1:-1:-1;;;5756:1:1;5749:88;5856:4;5853:1;5846:15;5880:4;5877:1;5870:15;5896:168;5969:9;;;6000;;6017:15;;;6011:22;;5997:37;5987:71;;6038:18;;:::i;6069:274::-;6109:1;6135;6125:189;;-1:-1:-1;;;6167:1:1;6160:88;6271:4;6268:1;6261:15;6299:4;6296:1;6289:15;6125:189;-1:-1:-1;6328:9:1;;6069:274::o;7173:125::-;7238:9;;;7259:10;;;7256:36;;;7272:18;;:::i;8294:251::-;8364:6;8417:2;8405:9;8396:7;8392:23;8388:32;8385:52;;;8433:1;8430;8423:12;8385:52;8465:9;8459:16;8484:31;8509:5;8484:31;:::i;13281:128::-;13348:9;;;13369:11;;;13366:37;;;13383:18;;:::i;14010:184::-;-1:-1:-1;;;14059:1:1;14052:88;14159:4;14156:1;14149:15;14183:4;14180:1;14173:15;14199:1005;14461:4;14509:3;14498:9;14494:19;14540:6;14529:9;14522:25;14583:6;14578:2;14567:9;14563:18;14556:34;14626:3;14621:2;14610:9;14606:18;14599:31;14650:6;14685;14679:13;14716:6;14708;14701:22;14754:3;14743:9;14739:19;14732:26;;14793:2;14785:6;14781:15;14767:29;;14814:1;14824:218;14838:6;14835:1;14832:13;14824:218;;;14903:13;;-1:-1:-1;;;;;14899:62:1;14887:75;;14991:2;15017:15;;;;14982:12;;;;14860:1;14853:9;14824:218;;;-1:-1:-1;;;;;;;15098:55:1;;;;15093:2;15078:18;;15071:83;-1:-1:-1;;15185:3:1;15170:19;15163:35;15059:3;14199:1005;-1:-1:-1;;;14199:1005:1:o
Swarm Source
ipfs://6675acce7568cd03a95ac7ae8d6e47e1218c891adeeff4afd7495393d69930e4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.