ERC-20
Artificial Intelligence
Overview
Max Total Supply
100,000,000 FILTER
Holders
441 ( 0.226%)
Total Transfers
-
Market
Price
$0.02 @ 0.000008 ETH (-3.73%)
Onchain Market Cap
$1,948,623.00
Circulating Supply Market Cap
$1,360,831.00
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FilterAI
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// Sources flattened with hardhat v2.22.6 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File @openzeppelin/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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); } } // File @openzeppelin/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; /** * @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); } // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.20; /** * @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}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * 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. */ abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { mapping(address account => uint256) private _balances; mapping(address account => mapping(address spender => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * 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 returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual 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 default value returned by this function, unless * it's 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 returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows _totalSupply += value; } else { uint256 fromBalance = _balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. _balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. _totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. _balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` 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. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * ``` * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } _allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } } // File contracts/TaxERC20uniswaponly.sol // Original license: SPDX_License_Identifier: MIT pragma solidity >=0.6.2; 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.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } pragma solidity ^0.8.0; contract FilterAI is ERC20, Ownable { IUniswapV2Router02 public uniswapV2Router; address public uniswapV2Pair; bool private swapping; address payable public devWallet; uint256 public taxFee = 5; // 5% tax rate uint256 public swapTokensAtAmount = 100000 * 10 ** decimals(); // Minimum tokens required for swap uint256 public maxTransfer = 100000000 * 10 ** decimals(); // Maximum transfer limit uint256 public slippage = 100; // Default slippage of 1% mapping(address => bool) private _isExcludedFromFees; event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity); event ExcludeFromFees(address indexed account, bool isExcluded); event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded); event DevWalletChanged(address indexed previousWallet, address indexed newWallet); event Log(string message); event LogAddress(string message, address addr); event LogAmount(string message, uint256 amount); constructor(address _router, address _owner, address _multisig) ERC20("Filter AI", "FILTER") Ownable(_owner) { emit LogAddress("Constructor called with router:", _router); emit LogAddress("Constructor called with owner:", _owner); emit LogAddress("Constructor called with multisig:", _multisig); require(_router != address(0), "Router address cannot be zero"); require(_owner != address(0), "Owner address cannot be zero"); require(_multisig != address(0), "Multisig address cannot be zero"); devWallet = payable(_multisig); // Mint initial supply to the multisig _mint(_multisig, 100000000 * 10 ** decimals()); emit LogAmount("Initial supply minted to multisig:", 100000000 * 10 ** decimals()); // Set the Uniswap router uniswapV2Router = IUniswapV2Router02(_router); emit LogAddress("UniswapV2Router set:", address(uniswapV2Router)); // Create the Uniswap pair uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); emit LogAddress("UniswapV2Pair created:", uniswapV2Pair); // Exclude from fees or having max transaction amount excludeFromFees(_multisig, true); excludeFromFees(address(this), true); } receive() external payable {} function setUniswapV2Router(address _router) external onlyOwner { uniswapV2Router = IUniswapV2Router02(_router); uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); } function excludeFromFees(address account, bool excluded) public onlyOwner { require(_isExcludedFromFees[account] != excluded, "Account is already excluded"); _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) public onlyOwner { require(accounts.length <= 100, "Too many addresses"); // Example limit for (uint256 i = 0; i < accounts.length; i++) { _isExcludedFromFees[accounts[i]] = excluded; } emit ExcludeMultipleAccountsFromFees(accounts, excluded); } function setDevWallet(address payable wallet) external onlyOwner { emit DevWalletChanged(devWallet, wallet); devWallet = wallet; } function setSwapAtAmount(uint256 value) external onlyOwner { swapTokensAtAmount = value; } function setSlippage(uint256 _slippage) external onlyOwner { slippage = _slippage; } function isExcludedFromFees(address account) public view returns (bool) { return _isExcludedFromFees[account]; } function swapAndSendToFee(uint256 tokens) internal { uint256 initialBalance = address(this).balance; swapTokensForETH(tokens); uint256 newBalance = address(this).balance - initialBalance; emit SwapAndLiquify(tokens, newBalance, 0); (bool success, ) = devWallet.call{value: newBalance}(""); require(success, "Transfer to devWallet failed"); } function _update(address from, address to, uint256 amount) internal override { if (from == address(0)) { super._update(from, to, amount); return; } emit LogAddress("Updating from address:", from); emit LogAddress("Updating to address:", to); emit LogAmount("Amount:", amount); require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); if (amount == 0) { emit Log("Amount is zero, calling super._update with 0"); super._update(from, to, 0); return; } uint256 contractTokenBalance = balanceOf(address(this)); emit LogAmount("Contract token balance:", contractTokenBalance); bool canSwap = contractTokenBalance >= swapTokensAtAmount; emit Log(canSwap ? "Can swap" : "Cannot swap"); if (canSwap && !swapping && from != owner() && to != owner() && from != address(this) && to != address(this)) { emit Log("Swapping"); swapping = true; uint256 tokensToSwap = swapTokensAtAmount; emit LogAmount("Tokens to swap:", tokensToSwap); internalTransfer(address(this), address(this), tokensToSwap); // Use internalTransfer to avoid applying tax swapAndSendToFee(tokensToSwap); emit Log("Swapped and sent to fee"); swapping = false; } bool takeFee = !swapping; emit Log(takeFee ? "Taking fee" : "Not taking fee"); if (_isExcludedFromFees[from] || _isExcludedFromFees[to] || from == address(this)) { takeFee = false; } if (takeFee && (from == uniswapV2Pair || to == uniswapV2Pair)) { require(amount <= maxTransfer, "Transfer amount exceeds the maximum limit"); uint256 taxAmount = amount * taxFee / 100; uint256 transferAmount = amount - taxAmount; emit LogAmount("Tax amount:", taxAmount); emit LogAmount("Transfer amount:", transferAmount); internalTransfer(from, address(this), taxAmount); internalTransfer(from, to, transferAmount); } else { internalTransfer(from, to, amount); } } function internalTransfer(address from, address to, uint256 amount) internal { super._update(from, to, amount); } function setTaxFee(uint256 _taxFee) external onlyOwner { taxFee = _taxFee; } function setMaxTransfer(uint256 _maxTransfer) external onlyOwner { maxTransfer = _maxTransfer; } function renounceOwnership() public override onlyOwner { super.renounceOwnership(); } function withdrawEther() external onlyOwner { (bool success, ) = owner().call{value: address(this).balance}(""); require(success, "Withdrawal failed"); } function swapTokensForETH(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } }
{ "evmVersion": "paris", "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_multisig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":"previousWallet","type":"address"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"DevWalletChanged","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":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"Log","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"LogAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"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":"maxTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransfer","type":"uint256"}],"name":"setMaxTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_slippage","type":"uint256"}],"name":"setSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setSwapAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxFee","type":"uint256"}],"name":"setTaxFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"slippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"taxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600560095562000019620007b660201b60201c565b600a62000027919062001e01565b620186a062000037919062001e52565b600a556200004a620007b660201b60201c565b600a62000058919062001e01565b6305f5e10062000069919062001e52565b600b556064600c553480156200007e57600080fd5b5060405162006bcd38038062006bcd8339818101604052810190620000a4919062001f07565b816040518060400160405280600981526020017f46696c74657220414900000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f46494c54455200000000000000000000000000000000000000000000000000008152508160039081620001229190620021d3565b508060049081620001349190620021d3565b505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001ac5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620001a39190620022cb565b60405180910390fd5b620001bd81620007bf60201b60201c565b507f62ddffe5b5108385f7a590f100e1ee414ad9551a31f089e64e82998440785e1e83604051620001ef919062002349565b60405180910390a17f62ddffe5b5108385f7a590f100e1ee414ad9551a31f089e64e82998440785e1e82604051620002289190620023cb565b60405180910390a17f62ddffe5b5108385f7a590f100e1ee414ad9551a31f089e64e82998440785e1e8160405162000261919062002473565b60405180910390a1600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620002db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d290620024f5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200034d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003449062002567565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620003bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b690620025d9565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004408162000415620007b660201b60201c565b600a62000423919062001e01565b6305f5e10062000434919062001e52565b6200088560201b60201c565b7fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b99862000471620007b660201b60201c565b600a6200047f919062001e01565b6305f5e10062000490919062001e52565b6040516200049f919062002682565b60405180910390a182600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f62ddffe5b5108385f7a590f100e1ee414ad9551a31f089e64e82998440785e1e600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516200053b919062002704565b60405180910390a1600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005b1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005d7919062002736565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000661573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000687919062002736565b6040518363ffffffff1660e01b8152600401620006a692919062002768565b6020604051808303816000875af1158015620006c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006ec919062002736565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f62ddffe5b5108385f7a590f100e1ee414ad9551a31f089e64e82998440785e1e600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516200077f9190620027e5565b60405180910390a16200079a8160016200091260201b60201c565b620007ad3060016200091260201b60201c565b5050506200340d565b60006012905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620008fa5760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401620008f19190620022cb565b60405180910390fd5b6200090e6000838362000a6260201b60201c565b5050565b620009226200136c60201b60201c565b801515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503620009b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009ae9062002867565b60405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162000a569190620028a6565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000ab05762000aaa8383836200140e60201b60201c565b62001367565b7f62ddffe5b5108385f7a590f100e1ee414ad9551a31f089e64e82998440785e1e8360405162000ae1919062002913565b60405180910390a17f62ddffe5b5108385f7a590f100e1ee414ad9551a31f089e64e82998440785e1e8260405162000b1a919062002995565b60405180910390a17fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b9988160405162000b53919062002a17565b60405180910390a1600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362000bcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000bc49062002abf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000c3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c369062002b57565b60405180910390fd5b6000810362000c99577fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab60405162000c779062002bef565b60405180910390a162000c93838360006200140e60201b60201c565b62001367565b600062000cac306200163e60201b60201c565b90507fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b9988160405162000cdf919062002c61565b60405180910390a16000600a5482101590507fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab8162000d54576040518060400160405280600b81526020017f43616e6e6f74207377617000000000000000000000000000000000000000000081525062000d8b565b6040518060400160405280600881526020017f43616e20737761700000000000000000000000000000000000000000000000008152505b60405162000d9a919062002d11565b60405180910390a180801562000dbd5750600760149054906101000a900460ff16155b801562000e05575062000dd56200168660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801562000e4d575062000e1d6200168660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b801562000e8657503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b801562000ebf57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1562000fcf577fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab60405162000ef49062002d85565b60405180910390a16001600760146101000a81548160ff0219169083151502179055506000600a5490507fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b9988160405162000f4f919062002df7565b60405180910390a162000f6a303083620016b060201b60201c565b62000f7b81620016c860201b60201c565b7fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab60405162000faa9062002e79565b60405180910390a16000600760146101000a81548160ff021916908315150217905550505b6000600760149054906101000a900460ff161590507fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab8162001047576040518060400160405280600e81526020017f4e6f742074616b696e67206665650000000000000000000000000000000000008152506200107e565b6040518060400160405280600a81526020017f54616b696e6720666565000000000000000000000000000000000000000000008152505b6040516200108d919062002d11565b60405180910390a1600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680620011375750600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806200116e57503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b156200117957600090505b8080156200122d5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614806200122c5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b5b156200134f57600b548411156200127b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620012729062002f11565b60405180910390fd5b60006064600954866200128f919062001e52565b6200129b919062002f62565b905060008186620012ad919062002f9a565b90507fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b99882604051620012e0919062003025565b60405180910390a17fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b99881604051620013199190620030a7565b60405180910390a162001334883084620016b060201b60201c565b62001347888883620016b060201b60201c565b505062001363565b62001362868686620016b060201b60201c565b5b5050505b505050565b6200137c6200180960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620013a26200168660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200140c57620013ce6200180960201b60201c565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401620014039190620022cb565b60405180910390fd5b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362001464578060026000828254620014579190620030d9565b925050819055506200153a565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015620014f3578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401620014ea9392919062003114565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620015855780600260008282540392505081905550620015d2565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162001631919062003151565b60405180910390a3505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620016c38383836200140e60201b60201c565b505050565b6000479050620016de826200181160201b60201c565b60008147620016ee919062002f9a565b90507f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561838260006040516200172693929190620031b1565b60405180910390a16000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051620017789062003223565b60006040518083038185875af1925050503d8060008114620017b7576040519150601f19603f3d011682016040523d82523d6000602084013e620017bc565b606091505b505090508062001803576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620017fa906200328a565b60405180910390fd5b50505050565b600033905090565b6000600267ffffffffffffffff81111562001831576200183062001f6e565b5b604051908082528060200260200182016040528015620018605781602001602082028036833780820191505090505b50905030816000815181106200187b576200187a620032ac565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001923573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001949919062002736565b8160018151811062001960576200195f620032ac565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050620019cf30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168462001a6d60201b60201c565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b815260040162001a35959493929190620033a9565b600060405180830381600087803b15801562001a5057600080fd5b505af115801562001a65573d6000803e3d6000fd5b505050505050565b62001a82838383600162001a8760201b60201c565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160362001afc5760006040517fe602df0500000000000000000000000000000000000000000000000000000000815260040162001af39190620022cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362001b715760006040517f94280d6200000000000000000000000000000000000000000000000000000000815260040162001b689190620022cb565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550801562001c61578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405162001c58919062003151565b60405180910390a35b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562001cf55780860481111562001ccd5762001ccc62001c67565b5b600185161562001cdd5780820291505b808102905062001ced8562001c96565b945062001cad565b94509492505050565b60008262001d10576001905062001de3565b8162001d20576000905062001de3565b816001811462001d39576002811462001d445762001d7a565b600191505062001de3565b60ff84111562001d595762001d5862001c67565b5b8360020a91508482111562001d735762001d7262001c67565b5b5062001de3565b5060208310610133831016604e8410600b841016171562001db45782820a90508381111562001dae5762001dad62001c67565b5b62001de3565b62001dc3848484600162001ca3565b9250905081840481111562001ddd5762001ddc62001c67565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b600062001e0e8262001dea565b915062001e1b8362001df4565b925062001e4a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462001cfe565b905092915050565b600062001e5f8262001dea565b915062001e6c8362001dea565b925082820262001e7c8162001dea565b9150828204841483151762001e965762001e9562001c67565b5b5092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062001ecf8262001ea2565b9050919050565b62001ee18162001ec2565b811462001eed57600080fd5b50565b60008151905062001f018162001ed6565b92915050565b60008060006060848603121562001f235762001f2262001e9d565b5b600062001f338682870162001ef0565b935050602062001f468682870162001ef0565b925050604062001f598682870162001ef0565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062001fe557607f821691505b60208210810362001ffb5762001ffa62001f9d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620020657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262002026565b62002071868362002026565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620020b4620020ae620020a88462001dea565b62002089565b62001dea565b9050919050565b6000819050919050565b620020d08362002093565b620020e8620020df82620020bb565b84845462002033565b825550505050565b600090565b620020ff620020f0565b6200210c818484620020c5565b505050565b5b81811015620021345762002128600082620020f5565b60018101905062002112565b5050565b601f82111562002183576200214d8162002001565b620021588462002016565b8101602085101562002168578190505b62002180620021778562002016565b83018262002111565b50505b505050565b600082821c905092915050565b6000620021a86000198460080262002188565b1980831691505092915050565b6000620021c3838362002195565b9150826002028217905092915050565b620021de8262001f63565b67ffffffffffffffff811115620021fa57620021f962001f6e565b5b62002206825462001fcc565b6200221382828562002138565b600060209050601f8311600181146200224b576000841562002236578287015190505b620022428582620021b5565b865550620022b2565b601f1984166200225b8662002001565b60005b8281101562002285578489015182556001820191506020850194506020810190506200225e565b86831015620022a55784890151620022a1601f89168262002195565b8355505b6001600288020188555050505b505050505050565b620022c58162001ec2565b82525050565b6000602082019050620022e26000830184620022ba565b92915050565b600082825260208201905092915050565b7f436f6e7374727563746f722063616c6c6564207769746820726f757465723a00600082015250565b600062002331601f83620022e8565b91506200233e82620022f9565b602082019050919050565b60006040820190508181036000830152620023648162002322565b9050620023756020830184620022ba565b92915050565b7f436f6e7374727563746f722063616c6c65642077697468206f776e65723a0000600082015250565b6000620023b3601e83620022e8565b9150620023c0826200237b565b602082019050919050565b60006040820190508181036000830152620023e681620023a4565b9050620023f76020830184620022ba565b92915050565b7f436f6e7374727563746f722063616c6c65642077697468206d756c746973696760008201527f3a00000000000000000000000000000000000000000000000000000000000000602082015250565b60006200245b602183620022e8565b91506200246882620023fd565b604082019050919050565b600060408201905081810360008301526200248e816200244c565b90506200249f6020830184620022ba565b92915050565b7f526f7574657220616464726573732063616e6e6f74206265207a65726f000000600082015250565b6000620024dd601d83620022e8565b9150620024ea82620024a5565b602082019050919050565b600060208201905081810360008301526200251081620024ce565b9050919050565b7f4f776e657220616464726573732063616e6e6f74206265207a65726f00000000600082015250565b60006200254f601c83620022e8565b91506200255c8262002517565b602082019050919050565b60006020820190508181036000830152620025828162002540565b9050919050565b7f4d756c746973696720616464726573732063616e6e6f74206265207a65726f00600082015250565b6000620025c1601f83620022e8565b9150620025ce8262002589565b602082019050919050565b60006020820190508181036000830152620025f481620025b2565b9050919050565b7f496e697469616c20737570706c79206d696e74656420746f206d756c7469736960008201527f673a000000000000000000000000000000000000000000000000000000000000602082015250565b600062002659602283620022e8565b91506200266682620025fb565b604082019050919050565b6200267c8162001dea565b82525050565b600060408201905081810360008301526200269d816200264a565b9050620026ae602083018462002671565b92915050565b7f556e69737761705632526f75746572207365743a000000000000000000000000600082015250565b6000620026ec601483620022e8565b9150620026f982620026b4565b602082019050919050565b600060408201905081810360008301526200271f81620026dd565b9050620027306020830184620022ba565b92915050565b6000602082840312156200274f576200274e62001e9d565b5b60006200275f8482850162001ef0565b91505092915050565b60006040820190506200277f6000830185620022ba565b6200278e6020830184620022ba565b9392505050565b7f556e697377617056325061697220637265617465643a00000000000000000000600082015250565b6000620027cd601683620022e8565b9150620027da8262002795565b602082019050919050565b600060408201905081810360008301526200280081620027be565b9050620028116020830184620022ba565b92915050565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b60006200284f601b83620022e8565b91506200285c8262002817565b602082019050919050565b60006020820190508181036000830152620028828162002840565b9050919050565b60008115159050919050565b620028a08162002889565b82525050565b6000602082019050620028bd600083018462002895565b92915050565b7f5570646174696e672066726f6d20616464726573733a00000000000000000000600082015250565b6000620028fb601683620022e8565b91506200290882620028c3565b602082019050919050565b600060408201905081810360008301526200292e81620028ec565b90506200293f6020830184620022ba565b92915050565b7f5570646174696e6720746f20616464726573733a000000000000000000000000600082015250565b60006200297d601483620022e8565b91506200298a8262002945565b602082019050919050565b60006040820190508181036000830152620029b0816200296e565b9050620029c16020830184620022ba565b92915050565b7f416d6f756e743a00000000000000000000000000000000000000000000000000600082015250565b6000620029ff600783620022e8565b915062002a0c82620029c7565b602082019050919050565b6000604082019050818103600083015262002a3281620029f0565b905062002a43602083018462002671565b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600062002aa7602583620022e8565b915062002ab48262002a49565b604082019050919050565b6000602082019050818103600083015262002ada8162002a98565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600062002b3f602383620022e8565b915062002b4c8262002ae1565b604082019050919050565b6000602082019050818103600083015262002b728162002b30565b9050919050565b7f416d6f756e74206973207a65726f2c2063616c6c696e672073757065722e5f7560008201527f7064617465207769746820300000000000000000000000000000000000000000602082015250565b600062002bd7602c83620022e8565b915062002be48262002b79565b604082019050919050565b6000602082019050818103600083015262002c0a8162002bc8565b9050919050565b7f436f6e747261637420746f6b656e2062616c616e63653a000000000000000000600082015250565b600062002c49601783620022e8565b915062002c568262002c11565b602082019050919050565b6000604082019050818103600083015262002c7c8162002c3a565b905062002c8d602083018462002671565b92915050565b60005b8381101562002cb357808201518184015260208101905062002c96565b60008484015250505050565b6000601f19601f8301169050919050565b600062002cdd8262001f63565b62002ce98185620022e8565b935062002cfb81856020860162002c93565b62002d068162002cbf565b840191505092915050565b6000602082019050818103600083015262002d2d818462002cd0565b905092915050565b7f5377617070696e67000000000000000000000000000000000000000000000000600082015250565b600062002d6d600883620022e8565b915062002d7a8262002d35565b602082019050919050565b6000602082019050818103600083015262002da08162002d5e565b9050919050565b7f546f6b656e7320746f20737761703a0000000000000000000000000000000000600082015250565b600062002ddf600f83620022e8565b915062002dec8262002da7565b602082019050919050565b6000604082019050818103600083015262002e128162002dd0565b905062002e23602083018462002671565b92915050565b7f5377617070656420616e642073656e7420746f20666565000000000000000000600082015250565b600062002e61601783620022e8565b915062002e6e8262002e29565b602082019050919050565b6000602082019050818103600083015262002e948162002e52565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61786960008201527f6d756d206c696d69740000000000000000000000000000000000000000000000602082015250565b600062002ef9602983620022e8565b915062002f068262002e9b565b604082019050919050565b6000602082019050818103600083015262002f2c8162002eea565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600062002f6f8262001dea565b915062002f7c8362001dea565b92508262002f8f5762002f8e62002f33565b5b828204905092915050565b600062002fa78262001dea565b915062002fb48362001dea565b925082820390508181111562002fcf5762002fce62001c67565b5b92915050565b7f54617820616d6f756e743a000000000000000000000000000000000000000000600082015250565b60006200300d600b83620022e8565b91506200301a8262002fd5565b602082019050919050565b60006040820190508181036000830152620030408162002ffe565b905062003051602083018462002671565b92915050565b7f5472616e7366657220616d6f756e743a00000000000000000000000000000000600082015250565b60006200308f601083620022e8565b91506200309c8262003057565b602082019050919050565b60006040820190508181036000830152620030c28162003080565b9050620030d3602083018462002671565b92915050565b6000620030e68262001dea565b9150620030f38362001dea565b92508282019050808211156200310e576200310d62001c67565b5b92915050565b60006060820190506200312b6000830186620022ba565b6200313a602083018562002671565b62003149604083018462002671565b949350505050565b600060208201905062003168600083018462002671565b92915050565b6000819050919050565b600062003199620031936200318d846200316e565b62002089565b62001dea565b9050919050565b620031ab8162003178565b82525050565b6000606082019050620031c8600083018662002671565b620031d7602083018562002671565b620031e66040830184620031a0565b949350505050565b600081905092915050565b50565b60006200320b600083620031ee565b91506200321882620031f9565b600082019050919050565b60006200323082620031fc565b9150819050919050565b7f5472616e7366657220746f2064657657616c6c6574206661696c656400000000600082015250565b600062003272601c83620022e8565b91506200327f826200323a565b602082019050919050565b60006020820190508181036000830152620032a58162003263565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b620033128162001ec2565b82525050565b600062003326838362003307565b60208301905092915050565b6000602082019050919050565b60006200334c82620032db565b620033588185620032e6565b93506200336583620032f7565b8060005b838110156200339c57815162003380888262003318565b97506200338d8362003332565b92505060018101905062003369565b5085935050505092915050565b600060a082019050620033c0600083018862002671565b620033cf6020830187620031a0565b8181036040830152620033e381866200333f565b9050620033f46060830185620022ba565b62003403608083018462002671565b9695505050505050565b6137b0806200341d6000396000f3fe6080604052600436106101c65760003560e01c80637362377b116100f7578063c024666811610095578063e2f4560511610064578063e2f456051461063b578063ed233ee914610666578063f0fa55a914610691578063f2fde38b146106ba576101cd565b8063c024666814610583578063c4081a4c146105ac578063c492f046146105d5578063dd62ed3e146105fe576101cd565b80638ea5220f116100d15780638ea5220f146104c557806395d89b41146104f0578063a071dcf41461051b578063a9059cbb14610546576101cd565b80637362377b1461045a57806377348de9146104715780638da5cb5b1461049a576101cd565b8063313ce567116101645780634fbee1931161013e5780634fbee193146103a05780636402511e146103dd57806370a0823114610406578063715018a614610443576101cd565b8063313ce5671461031f5780633e032a3b1461034a57806349bd5a5e14610375576101cd565b80631694505e116101a05780631694505e1461026357806318160ddd1461028e5780631f53ac02146102b957806323b872dd146102e2576101cd565b806306fdde03146101d2578063095ea7b3146101fd5780631419841d1461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101e76106e3565b6040516101f491906124f8565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f91906125b8565b610775565b6040516102319190612613565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061262e565b610798565b005b34801561026f57600080fd5b506102786109c2565b60405161028591906126ba565b60405180910390f35b34801561029a57600080fd5b506102a36109e8565b6040516102b091906126e4565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db919061273d565b6109f2565b005b3480156102ee57600080fd5b506103096004803603810190610304919061276a565b610aba565b6040516103169190612613565b60405180910390f35b34801561032b57600080fd5b50610334610ae9565b60405161034191906127d9565b60405180910390f35b34801561035657600080fd5b5061035f610af2565b60405161036c91906126e4565b60405180910390f35b34801561038157600080fd5b5061038a610af8565b6040516103979190612803565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c2919061262e565b610b1e565b6040516103d49190612613565b60405180910390f35b3480156103e957600080fd5b5061040460048036038101906103ff919061281e565b610b74565b005b34801561041257600080fd5b5061042d6004803603810190610428919061262e565b610b86565b60405161043a91906126e4565b60405180910390f35b34801561044f57600080fd5b50610458610bce565b005b34801561046657600080fd5b5061046f610be0565b005b34801561047d57600080fd5b506104986004803603810190610493919061281e565b610c9e565b005b3480156104a657600080fd5b506104af610cb0565b6040516104bc9190612803565b60405180910390f35b3480156104d157600080fd5b506104da610cda565b6040516104e7919061285a565b60405180910390f35b3480156104fc57600080fd5b50610505610d00565b60405161051291906124f8565b60405180910390f35b34801561052757600080fd5b50610530610d92565b60405161053d91906126e4565b60405180910390f35b34801561055257600080fd5b5061056d600480360381019061056891906125b8565b610d98565b60405161057a9190612613565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a591906128a1565b610dbb565b005b3480156105b857600080fd5b506105d360048036038101906105ce919061281e565b610efe565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190612946565b610f10565b005b34801561060a57600080fd5b50610625600480360381019061062091906129a6565b61103f565b60405161063291906126e4565b60405180910390f35b34801561064757600080fd5b506106506110c6565b60405161065d91906126e4565b60405180910390f35b34801561067257600080fd5b5061067b6110cc565b60405161068891906126e4565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b3919061281e565b6110d2565b005b3480156106c657600080fd5b506106e160048036038101906106dc919061262e565b6110e4565b005b6060600380546106f290612a15565b80601f016020809104026020016040519081016040528092919081815260200182805461071e90612a15565b801561076b5780601f106107405761010080835404028352916020019161076b565b820191906000526020600020905b81548152906001019060200180831161074e57829003601f168201915b5050505050905090565b60008061078061116a565b905061078d818585611172565b600191505092915050565b6107a0611184565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108729190612a5b565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091f9190612a5b565b6040518363ffffffff1660e01b815260040161093c929190612a88565b6020604051808303816000875af115801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f9190612a5b565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b6109fa611184565b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f02a22d8de7d57d9eaec063aa8634746acc28f904575d7777abb0ac8dc292fc9060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610ac561116a565b9050610ad285828561120b565b610add85858561129f565b60019150509392505050565b60006012905090565b600c5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610b7c611184565b80600a8190555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bd6611184565b610bde611393565b565b610be8611184565b6000610bf2610cb0565b73ffffffffffffffffffffffffffffffffffffffff1647604051610c1590612ae2565b60006040518083038185875af1925050503d8060008114610c52576040519150601f19603f3d011682016040523d82523d6000602084013e610c57565b606091505b5050905080610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290612b43565b60405180910390fd5b50565b610ca6611184565b80600b8190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054610d0f90612a15565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3b90612a15565b8015610d885780601f10610d5d57610100808354040283529160200191610d88565b820191906000526020600020905b815481529060010190602001808311610d6b57829003601f168201915b5050505050905090565b60095481565b600080610da361116a565b9050610db081858561129f565b600191505092915050565b610dc3611184565b801515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90612baf565b60405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051610ef29190612613565b60405180910390a25050565b610f06611184565b8060098190555050565b610f18611184565b6064838390501115610f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5690612c1b565b60405180910390fd5b60005b83839050811015610ffe5781600d6000868685818110610f8557610f84612c3b565b5b9050602002016020810190610f9a919061262e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610ff690612c99565b915050610f62565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b3583838360405161103293929190612da4565b60405180910390a1505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b600b5481565b6110da611184565b80600c8190555050565b6110ec611184565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361115e5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016111559190612803565b60405180910390fd5b611167816113a7565b50565b600033905090565b61117f838383600161146d565b505050565b61118c61116a565b73ffffffffffffffffffffffffffffffffffffffff166111aa610cb0565b73ffffffffffffffffffffffffffffffffffffffff1614611209576111cd61116a565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016112009190612803565b60405180910390fd5b565b6000611217848461103f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112995781811015611289578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161128093929190612dd6565b60405180910390fd5b6112988484848403600061146d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113115760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016113089190612803565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113835760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161137a9190612803565b60405180910390fd5b61138e838383611644565b505050565b61139b611184565b6113a560006113a7565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036114df5760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016114d69190612803565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115515760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016115489190612803565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550801561163e578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161163591906126e4565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361168857611683838383611ec2565b611ebd565b7f62ddffe5b5108385f7a590f100e1ee414ad9551a31f089e64e82998440785e1e836040516116b79190612e59565b60405180910390a17f62ddffe5b5108385f7a590f100e1ee414ad9551a31f089e64e82998440785e1e826040516116ee9190612ed3565b60405180910390a17fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b998816040516117259190612f4d565b60405180910390a1600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361179c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179390612fed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361180b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118029061307f565b60405180910390fd5b60008103611859577fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab60405161184090613111565b60405180910390a161185483836000611ec2565b611ebd565b600061186430610b86565b90507fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b99881604051611895919061317d565b60405180910390a16000600a5482101590507fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab81611908576040518060400160405280600b81526020017f43616e6e6f74207377617000000000000000000000000000000000000000000081525061193f565b6040518060400160405280600881526020017f43616e20737761700000000000000000000000000000000000000000000000008152505b60405161194c91906124f8565b60405180910390a180801561196e5750600760149054906101000a900460ff16155b80156119ad575061197d610cb0565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156119ec57506119bc610cb0565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015611a2457503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015611a5c57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611b55577fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab604051611a8e906131f7565b60405180910390a16001600760146101000a81548160ff0219169083151502179055506000600a5490507fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b99881604051611ae79190613263565b60405180910390a1611afa3030836120e7565b611b03816120f7565b7fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab604051611b30906132dd565b60405180910390a16000600760146101000a81548160ff021916908315150217905550505b6000600760149054906101000a900460ff161590507fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab81611bcb576040518060400160405280600e81526020017f4e6f742074616b696e6720666565000000000000000000000000000000000000815250611c02565b6040518060400160405280600a81526020017f54616b696e6720666565000000000000000000000000000000000000000000008152505b604051611c0f91906124f8565b60405180910390a1600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611cb85750600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80611cee57503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b15611cf857600090505b808015611daa5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480611da95750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b5b15611ead57600b54841115611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb9061336f565b60405180910390fd5b6000606460095486611e06919061338f565b611e109190613400565b905060008186611e209190613431565b90507fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b99882604051611e5191906134b1565b60405180910390a17fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b99881604051611e88919061352b565b60405180910390a1611e9b8830846120e7565b611ea68888836120e7565b5050611eb9565b611eb88686866120e7565b5b5050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f14578060026000828254611f089190613559565b92505081905550611fe7565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611fa0578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611f9793929190612dd6565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612030578060026000828254039250508190555061207d565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120da91906126e4565b60405180910390a3505050565b6120f2838383611ec2565b505050565b600047905061210582612225565b600081476121139190613431565b90507f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56183826000604051612149939291906135c8565b60405180910390a16000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161219990612ae2565b60006040518083038185875af1925050503d80600081146121d6576040519150601f19603f3d011682016040523d82523d6000602084013e6121db565b606091505b505090508061221f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122169061364b565b60405180910390fd5b50505050565b6000600267ffffffffffffffff8111156122425761224161366b565b5b6040519080825280602002602001820160405280156122705781602001602082028036833780820191505090505b509050308160008151811061228857612287612c3b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561232f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123539190612a5b565b8160018151811061236757612366612c3b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506123ce30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611172565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612432959493929190613720565b600060405180830381600087803b15801561244c57600080fd5b505af1158015612460573d6000803e3d6000fd5b505050505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124a2578082015181840152602081019050612487565b60008484015250505050565b6000601f19601f8301169050919050565b60006124ca82612468565b6124d48185612473565b93506124e4818560208601612484565b6124ed816124ae565b840191505092915050565b6000602082019050818103600083015261251281846124bf565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061254f82612524565b9050919050565b61255f81612544565b811461256a57600080fd5b50565b60008135905061257c81612556565b92915050565b6000819050919050565b61259581612582565b81146125a057600080fd5b50565b6000813590506125b28161258c565b92915050565b600080604083850312156125cf576125ce61251a565b5b60006125dd8582860161256d565b92505060206125ee858286016125a3565b9150509250929050565b60008115159050919050565b61260d816125f8565b82525050565b60006020820190506126286000830184612604565b92915050565b6000602082840312156126445761264361251a565b5b60006126528482850161256d565b91505092915050565b6000819050919050565b600061268061267b61267684612524565b61265b565b612524565b9050919050565b600061269282612665565b9050919050565b60006126a482612687565b9050919050565b6126b481612699565b82525050565b60006020820190506126cf60008301846126ab565b92915050565b6126de81612582565b82525050565b60006020820190506126f960008301846126d5565b92915050565b600061270a82612524565b9050919050565b61271a816126ff565b811461272557600080fd5b50565b60008135905061273781612711565b92915050565b6000602082840312156127535761275261251a565b5b600061276184828501612728565b91505092915050565b6000806000606084860312156127835761278261251a565b5b60006127918682870161256d565b93505060206127a28682870161256d565b92505060406127b3868287016125a3565b9150509250925092565b600060ff82169050919050565b6127d3816127bd565b82525050565b60006020820190506127ee60008301846127ca565b92915050565b6127fd81612544565b82525050565b600060208201905061281860008301846127f4565b92915050565b6000602082840312156128345761283361251a565b5b6000612842848285016125a3565b91505092915050565b612854816126ff565b82525050565b600060208201905061286f600083018461284b565b92915050565b61287e816125f8565b811461288957600080fd5b50565b60008135905061289b81612875565b92915050565b600080604083850312156128b8576128b761251a565b5b60006128c68582860161256d565b92505060206128d78582860161288c565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612906576129056128e1565b5b8235905067ffffffffffffffff811115612923576129226128e6565b5b60208301915083602082028301111561293f5761293e6128eb565b5b9250929050565b60008060006040848603121561295f5761295e61251a565b5b600084013567ffffffffffffffff81111561297d5761297c61251f565b5b612989868287016128f0565b9350935050602061299c8682870161288c565b9150509250925092565b600080604083850312156129bd576129bc61251a565b5b60006129cb8582860161256d565b92505060206129dc8582860161256d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a2d57607f821691505b602082108103612a4057612a3f6129e6565b5b50919050565b600081519050612a5581612556565b92915050565b600060208284031215612a7157612a7061251a565b5b6000612a7f84828501612a46565b91505092915050565b6000604082019050612a9d60008301856127f4565b612aaa60208301846127f4565b9392505050565b600081905092915050565b50565b6000612acc600083612ab1565b9150612ad782612abc565b600082019050919050565b6000612aed82612abf565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b6000612b2d601183612473565b9150612b3882612af7565b602082019050919050565b60006020820190508181036000830152612b5c81612b20565b9050919050565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b6000612b99601b83612473565b9150612ba482612b63565b602082019050919050565b60006020820190508181036000830152612bc881612b8c565b9050919050565b7f546f6f206d616e79206164647265737365730000000000000000000000000000600082015250565b6000612c05601283612473565b9150612c1082612bcf565b602082019050919050565b60006020820190508181036000830152612c3481612bf8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ca482612582565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612cd657612cd5612c6a565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b612d0581612544565b82525050565b6000612d178383612cfc565b60208301905092915050565b6000612d32602084018461256d565b905092915050565b6000602082019050919050565b6000612d538385612ce1565b9350612d5e82612cf2565b8060005b85811015612d9757612d748284612d23565b612d7e8882612d0b565b9750612d8983612d3a565b925050600181019050612d62565b5085925050509392505050565b60006040820190508181036000830152612dbf818587612d47565b9050612dce6020830184612604565b949350505050565b6000606082019050612deb60008301866127f4565b612df860208301856126d5565b612e0560408301846126d5565b949350505050565b7f5570646174696e672066726f6d20616464726573733a00000000000000000000600082015250565b6000612e43601683612473565b9150612e4e82612e0d565b602082019050919050565b60006040820190508181036000830152612e7281612e36565b9050612e8160208301846127f4565b92915050565b7f5570646174696e6720746f20616464726573733a000000000000000000000000600082015250565b6000612ebd601483612473565b9150612ec882612e87565b602082019050919050565b60006040820190508181036000830152612eec81612eb0565b9050612efb60208301846127f4565b92915050565b7f416d6f756e743a00000000000000000000000000000000000000000000000000600082015250565b6000612f37600783612473565b9150612f4282612f01565b602082019050919050565b60006040820190508181036000830152612f6681612f2a565b9050612f7560208301846126d5565b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612fd7602583612473565b9150612fe282612f7b565b604082019050919050565b6000602082019050818103600083015261300681612fca565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613069602383612473565b91506130748261300d565b604082019050919050565b600060208201905081810360008301526130988161305c565b9050919050565b7f416d6f756e74206973207a65726f2c2063616c6c696e672073757065722e5f7560008201527f7064617465207769746820300000000000000000000000000000000000000000602082015250565b60006130fb602c83612473565b91506131068261309f565b604082019050919050565b6000602082019050818103600083015261312a816130ee565b9050919050565b7f436f6e747261637420746f6b656e2062616c616e63653a000000000000000000600082015250565b6000613167601783612473565b915061317282613131565b602082019050919050565b600060408201905081810360008301526131968161315a565b90506131a560208301846126d5565b92915050565b7f5377617070696e67000000000000000000000000000000000000000000000000600082015250565b60006131e1600883612473565b91506131ec826131ab565b602082019050919050565b60006020820190508181036000830152613210816131d4565b9050919050565b7f546f6b656e7320746f20737761703a0000000000000000000000000000000000600082015250565b600061324d600f83612473565b915061325882613217565b602082019050919050565b6000604082019050818103600083015261327c81613240565b905061328b60208301846126d5565b92915050565b7f5377617070656420616e642073656e7420746f20666565000000000000000000600082015250565b60006132c7601783612473565b91506132d282613291565b602082019050919050565b600060208201905081810360008301526132f6816132ba565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61786960008201527f6d756d206c696d69740000000000000000000000000000000000000000000000602082015250565b6000613359602983612473565b9150613364826132fd565b604082019050919050565b600060208201905081810360008301526133888161334c565b9050919050565b600061339a82612582565b91506133a583612582565b92508282026133b381612582565b915082820484148315176133ca576133c9612c6a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061340b82612582565b915061341683612582565b925082613426576134256133d1565b5b828204905092915050565b600061343c82612582565b915061344783612582565b925082820390508181111561345f5761345e612c6a565b5b92915050565b7f54617820616d6f756e743a000000000000000000000000000000000000000000600082015250565b600061349b600b83612473565b91506134a682613465565b602082019050919050565b600060408201905081810360008301526134ca8161348e565b90506134d960208301846126d5565b92915050565b7f5472616e7366657220616d6f756e743a00000000000000000000000000000000600082015250565b6000613515601083612473565b9150613520826134df565b602082019050919050565b6000604082019050818103600083015261354481613508565b905061355360208301846126d5565b92915050565b600061356482612582565b915061356f83612582565b925082820190508082111561358757613586612c6a565b5b92915050565b6000819050919050565b60006135b26135ad6135a88461358d565b61265b565b612582565b9050919050565b6135c281613597565b82525050565b60006060820190506135dd60008301866126d5565b6135ea60208301856126d5565b6135f760408301846135b9565b949350505050565b7f5472616e7366657220746f2064657657616c6c6574206661696c656400000000600082015250565b6000613635601c83612473565b9150613640826135ff565b602082019050919050565b6000602082019050818103600083015261366481613628565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b60006136cd8261369a565b6136d78185612ce1565b93506136e2836136a5565b8060005b838110156137135781516136fa8882612d0b565b9750613705836136b5565b9250506001810190506136e6565b5085935050505092915050565b600060a08201905061373560008301886126d5565b61374260208301876135b9565b818103604083015261375481866136c2565b905061376360608301856127f4565b61377060808301846126d5565b969550505050505056fea2646970667358221220541797d602991ba48795fdef192a7c6ab95e931d14ddd77104ba6f955d5a33fb64736f6c634300081400330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000f5f08ba7f46e2a86b5ef3bfd56c2097c9f4276d70000000000000000000000007cb15a1216b749dfac79dd3038352ba1da94dcc4
Deployed Bytecode
0x6080604052600436106101c65760003560e01c80637362377b116100f7578063c024666811610095578063e2f4560511610064578063e2f456051461063b578063ed233ee914610666578063f0fa55a914610691578063f2fde38b146106ba576101cd565b8063c024666814610583578063c4081a4c146105ac578063c492f046146105d5578063dd62ed3e146105fe576101cd565b80638ea5220f116100d15780638ea5220f146104c557806395d89b41146104f0578063a071dcf41461051b578063a9059cbb14610546576101cd565b80637362377b1461045a57806377348de9146104715780638da5cb5b1461049a576101cd565b8063313ce567116101645780634fbee1931161013e5780634fbee193146103a05780636402511e146103dd57806370a0823114610406578063715018a614610443576101cd565b8063313ce5671461031f5780633e032a3b1461034a57806349bd5a5e14610375576101cd565b80631694505e116101a05780631694505e1461026357806318160ddd1461028e5780631f53ac02146102b957806323b872dd146102e2576101cd565b806306fdde03146101d2578063095ea7b3146101fd5780631419841d1461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101e76106e3565b6040516101f491906124f8565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f91906125b8565b610775565b6040516102319190612613565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061262e565b610798565b005b34801561026f57600080fd5b506102786109c2565b60405161028591906126ba565b60405180910390f35b34801561029a57600080fd5b506102a36109e8565b6040516102b091906126e4565b60405180910390f35b3480156102c557600080fd5b506102e060048036038101906102db919061273d565b6109f2565b005b3480156102ee57600080fd5b506103096004803603810190610304919061276a565b610aba565b6040516103169190612613565b60405180910390f35b34801561032b57600080fd5b50610334610ae9565b60405161034191906127d9565b60405180910390f35b34801561035657600080fd5b5061035f610af2565b60405161036c91906126e4565b60405180910390f35b34801561038157600080fd5b5061038a610af8565b6040516103979190612803565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c2919061262e565b610b1e565b6040516103d49190612613565b60405180910390f35b3480156103e957600080fd5b5061040460048036038101906103ff919061281e565b610b74565b005b34801561041257600080fd5b5061042d6004803603810190610428919061262e565b610b86565b60405161043a91906126e4565b60405180910390f35b34801561044f57600080fd5b50610458610bce565b005b34801561046657600080fd5b5061046f610be0565b005b34801561047d57600080fd5b506104986004803603810190610493919061281e565b610c9e565b005b3480156104a657600080fd5b506104af610cb0565b6040516104bc9190612803565b60405180910390f35b3480156104d157600080fd5b506104da610cda565b6040516104e7919061285a565b60405180910390f35b3480156104fc57600080fd5b50610505610d00565b60405161051291906124f8565b60405180910390f35b34801561052757600080fd5b50610530610d92565b60405161053d91906126e4565b60405180910390f35b34801561055257600080fd5b5061056d600480360381019061056891906125b8565b610d98565b60405161057a9190612613565b60405180910390f35b34801561058f57600080fd5b506105aa60048036038101906105a591906128a1565b610dbb565b005b3480156105b857600080fd5b506105d360048036038101906105ce919061281e565b610efe565b005b3480156105e157600080fd5b506105fc60048036038101906105f79190612946565b610f10565b005b34801561060a57600080fd5b50610625600480360381019061062091906129a6565b61103f565b60405161063291906126e4565b60405180910390f35b34801561064757600080fd5b506106506110c6565b60405161065d91906126e4565b60405180910390f35b34801561067257600080fd5b5061067b6110cc565b60405161068891906126e4565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b3919061281e565b6110d2565b005b3480156106c657600080fd5b506106e160048036038101906106dc919061262e565b6110e4565b005b6060600380546106f290612a15565b80601f016020809104026020016040519081016040528092919081815260200182805461071e90612a15565b801561076b5780601f106107405761010080835404028352916020019161076b565b820191906000526020600020905b81548152906001019060200180831161074e57829003601f168201915b5050505050905090565b60008061078061116a565b905061078d818585611172565b600191505092915050565b6107a0611184565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108729190612a5b565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091f9190612a5b565b6040518363ffffffff1660e01b815260040161093c929190612a88565b6020604051808303816000875af115801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f9190612a5b565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600254905090565b6109fa611184565b8073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f02a22d8de7d57d9eaec063aa8634746acc28f904575d7777abb0ac8dc292fc9060405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610ac561116a565b9050610ad285828561120b565b610add85858561129f565b60019150509392505050565b60006012905090565b600c5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610b7c611184565b80600a8190555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bd6611184565b610bde611393565b565b610be8611184565b6000610bf2610cb0565b73ffffffffffffffffffffffffffffffffffffffff1647604051610c1590612ae2565b60006040518083038185875af1925050503d8060008114610c52576040519150601f19603f3d011682016040523d82523d6000602084013e610c57565b606091505b5050905080610c9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9290612b43565b60405180910390fd5b50565b610ca6611184565b80600b8190555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054610d0f90612a15565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3b90612a15565b8015610d885780601f10610d5d57610100808354040283529160200191610d88565b820191906000526020600020905b815481529060010190602001808311610d6b57829003601f168201915b5050505050905090565b60095481565b600080610da361116a565b9050610db081858561129f565b600191505092915050565b610dc3611184565b801515600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c90612baf565b60405180910390fd5b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051610ef29190612613565b60405180910390a25050565b610f06611184565b8060098190555050565b610f18611184565b6064838390501115610f5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5690612c1b565b60405180910390fd5b60005b83839050811015610ffe5781600d6000868685818110610f8557610f84612c3b565b5b9050602002016020810190610f9a919061262e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610ff690612c99565b915050610f62565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b3583838360405161103293929190612da4565b60405180910390a1505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600a5481565b600b5481565b6110da611184565b80600c8190555050565b6110ec611184565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361115e5760006040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016111559190612803565b60405180910390fd5b611167816113a7565b50565b600033905090565b61117f838383600161146d565b505050565b61118c61116a565b73ffffffffffffffffffffffffffffffffffffffff166111aa610cb0565b73ffffffffffffffffffffffffffffffffffffffff1614611209576111cd61116a565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016112009190612803565b60405180910390fd5b565b6000611217848461103f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146112995781811015611289578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161128093929190612dd6565b60405180910390fd5b6112988484848403600061146d565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113115760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016113089190612803565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036113835760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161137a9190612803565b60405180910390fd5b61138e838383611644565b505050565b61139b611184565b6113a560006113a7565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036114df5760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016114d69190612803565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115515760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016115489190612803565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550801561163e578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161163591906126e4565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361168857611683838383611ec2565b611ebd565b7f62ddffe5b5108385f7a590f100e1ee414ad9551a31f089e64e82998440785e1e836040516116b79190612e59565b60405180910390a17f62ddffe5b5108385f7a590f100e1ee414ad9551a31f089e64e82998440785e1e826040516116ee9190612ed3565b60405180910390a17fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b998816040516117259190612f4d565b60405180910390a1600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361179c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179390612fed565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361180b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118029061307f565b60405180910390fd5b60008103611859577fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab60405161184090613111565b60405180910390a161185483836000611ec2565b611ebd565b600061186430610b86565b90507fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b99881604051611895919061317d565b60405180910390a16000600a5482101590507fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab81611908576040518060400160405280600b81526020017f43616e6e6f74207377617000000000000000000000000000000000000000000081525061193f565b6040518060400160405280600881526020017f43616e20737761700000000000000000000000000000000000000000000000008152505b60405161194c91906124f8565b60405180910390a180801561196e5750600760149054906101000a900460ff16155b80156119ad575061197d610cb0565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156119ec57506119bc610cb0565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b8015611a2457503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b8015611a5c57503073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b15611b55577fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab604051611a8e906131f7565b60405180910390a16001600760146101000a81548160ff0219169083151502179055506000600a5490507fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b99881604051611ae79190613263565b60405180910390a1611afa3030836120e7565b611b03816120f7565b7fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab604051611b30906132dd565b60405180910390a16000600760146101000a81548160ff021916908315150217905550505b6000600760149054906101000a900460ff161590507fcf34ef537ac33ee1ac626ca1587a0a7e8e51561e5514f8cb36afa1c5102b3bab81611bcb576040518060400160405280600e81526020017f4e6f742074616b696e6720666565000000000000000000000000000000000000815250611c02565b6040518060400160405280600a81526020017f54616b696e6720666565000000000000000000000000000000000000000000008152505b604051611c0f91906124f8565b60405180910390a1600d60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611cb85750600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b80611cee57503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b15611cf857600090505b808015611daa5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161480611da95750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b5b15611ead57600b54841115611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb9061336f565b60405180910390fd5b6000606460095486611e06919061338f565b611e109190613400565b905060008186611e209190613431565b90507fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b99882604051611e5191906134b1565b60405180910390a17fa300ff2f1192a0c399f1e0c21dabe181536be61631fbe1feb08d6b14e6d3b99881604051611e88919061352b565b60405180910390a1611e9b8830846120e7565b611ea68888836120e7565b5050611eb9565b611eb88686866120e7565b5b5050505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f14578060026000828254611f089190613559565b92505081905550611fe7565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611fa0578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401611f9793929190612dd6565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612030578060026000828254039250508190555061207d565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120da91906126e4565b60405180910390a3505050565b6120f2838383611ec2565b505050565b600047905061210582612225565b600081476121139190613431565b90507f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb56183826000604051612149939291906135c8565b60405180910390a16000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161219990612ae2565b60006040518083038185875af1925050503d80600081146121d6576040519150601f19603f3d011682016040523d82523d6000602084013e6121db565b606091505b505090508061221f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122169061364b565b60405180910390fd5b50505050565b6000600267ffffffffffffffff8111156122425761224161366b565b5b6040519080825280602002602001820160405280156122705781602001602082028036833780820191505090505b509050308160008151811061228857612287612c3b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561232f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123539190612a5b565b8160018151811061236757612366612c3b565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506123ce30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684611172565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b8152600401612432959493929190613720565b600060405180830381600087803b15801561244c57600080fd5b505af1158015612460573d6000803e3d6000fd5b505050505050565b600081519050919050565b600082825260208201905092915050565b60005b838110156124a2578082015181840152602081019050612487565b60008484015250505050565b6000601f19601f8301169050919050565b60006124ca82612468565b6124d48185612473565b93506124e4818560208601612484565b6124ed816124ae565b840191505092915050565b6000602082019050818103600083015261251281846124bf565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061254f82612524565b9050919050565b61255f81612544565b811461256a57600080fd5b50565b60008135905061257c81612556565b92915050565b6000819050919050565b61259581612582565b81146125a057600080fd5b50565b6000813590506125b28161258c565b92915050565b600080604083850312156125cf576125ce61251a565b5b60006125dd8582860161256d565b92505060206125ee858286016125a3565b9150509250929050565b60008115159050919050565b61260d816125f8565b82525050565b60006020820190506126286000830184612604565b92915050565b6000602082840312156126445761264361251a565b5b60006126528482850161256d565b91505092915050565b6000819050919050565b600061268061267b61267684612524565b61265b565b612524565b9050919050565b600061269282612665565b9050919050565b60006126a482612687565b9050919050565b6126b481612699565b82525050565b60006020820190506126cf60008301846126ab565b92915050565b6126de81612582565b82525050565b60006020820190506126f960008301846126d5565b92915050565b600061270a82612524565b9050919050565b61271a816126ff565b811461272557600080fd5b50565b60008135905061273781612711565b92915050565b6000602082840312156127535761275261251a565b5b600061276184828501612728565b91505092915050565b6000806000606084860312156127835761278261251a565b5b60006127918682870161256d565b93505060206127a28682870161256d565b92505060406127b3868287016125a3565b9150509250925092565b600060ff82169050919050565b6127d3816127bd565b82525050565b60006020820190506127ee60008301846127ca565b92915050565b6127fd81612544565b82525050565b600060208201905061281860008301846127f4565b92915050565b6000602082840312156128345761283361251a565b5b6000612842848285016125a3565b91505092915050565b612854816126ff565b82525050565b600060208201905061286f600083018461284b565b92915050565b61287e816125f8565b811461288957600080fd5b50565b60008135905061289b81612875565b92915050565b600080604083850312156128b8576128b761251a565b5b60006128c68582860161256d565b92505060206128d78582860161288c565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112612906576129056128e1565b5b8235905067ffffffffffffffff811115612923576129226128e6565b5b60208301915083602082028301111561293f5761293e6128eb565b5b9250929050565b60008060006040848603121561295f5761295e61251a565b5b600084013567ffffffffffffffff81111561297d5761297c61251f565b5b612989868287016128f0565b9350935050602061299c8682870161288c565b9150509250925092565b600080604083850312156129bd576129bc61251a565b5b60006129cb8582860161256d565b92505060206129dc8582860161256d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a2d57607f821691505b602082108103612a4057612a3f6129e6565b5b50919050565b600081519050612a5581612556565b92915050565b600060208284031215612a7157612a7061251a565b5b6000612a7f84828501612a46565b91505092915050565b6000604082019050612a9d60008301856127f4565b612aaa60208301846127f4565b9392505050565b600081905092915050565b50565b6000612acc600083612ab1565b9150612ad782612abc565b600082019050919050565b6000612aed82612abf565b9150819050919050565b7f5769746864726177616c206661696c6564000000000000000000000000000000600082015250565b6000612b2d601183612473565b9150612b3882612af7565b602082019050919050565b60006020820190508181036000830152612b5c81612b20565b9050919050565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b6000612b99601b83612473565b9150612ba482612b63565b602082019050919050565b60006020820190508181036000830152612bc881612b8c565b9050919050565b7f546f6f206d616e79206164647265737365730000000000000000000000000000600082015250565b6000612c05601283612473565b9150612c1082612bcf565b602082019050919050565b60006020820190508181036000830152612c3481612bf8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ca482612582565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612cd657612cd5612c6a565b5b600182019050919050565b600082825260208201905092915050565b6000819050919050565b612d0581612544565b82525050565b6000612d178383612cfc565b60208301905092915050565b6000612d32602084018461256d565b905092915050565b6000602082019050919050565b6000612d538385612ce1565b9350612d5e82612cf2565b8060005b85811015612d9757612d748284612d23565b612d7e8882612d0b565b9750612d8983612d3a565b925050600181019050612d62565b5085925050509392505050565b60006040820190508181036000830152612dbf818587612d47565b9050612dce6020830184612604565b949350505050565b6000606082019050612deb60008301866127f4565b612df860208301856126d5565b612e0560408301846126d5565b949350505050565b7f5570646174696e672066726f6d20616464726573733a00000000000000000000600082015250565b6000612e43601683612473565b9150612e4e82612e0d565b602082019050919050565b60006040820190508181036000830152612e7281612e36565b9050612e8160208301846127f4565b92915050565b7f5570646174696e6720746f20616464726573733a000000000000000000000000600082015250565b6000612ebd601483612473565b9150612ec882612e87565b602082019050919050565b60006040820190508181036000830152612eec81612eb0565b9050612efb60208301846127f4565b92915050565b7f416d6f756e743a00000000000000000000000000000000000000000000000000600082015250565b6000612f37600783612473565b9150612f4282612f01565b602082019050919050565b60006040820190508181036000830152612f6681612f2a565b9050612f7560208301846126d5565b92915050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612fd7602583612473565b9150612fe282612f7b565b604082019050919050565b6000602082019050818103600083015261300681612fca565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613069602383612473565b91506130748261300d565b604082019050919050565b600060208201905081810360008301526130988161305c565b9050919050565b7f416d6f756e74206973207a65726f2c2063616c6c696e672073757065722e5f7560008201527f7064617465207769746820300000000000000000000000000000000000000000602082015250565b60006130fb602c83612473565b91506131068261309f565b604082019050919050565b6000602082019050818103600083015261312a816130ee565b9050919050565b7f436f6e747261637420746f6b656e2062616c616e63653a000000000000000000600082015250565b6000613167601783612473565b915061317282613131565b602082019050919050565b600060408201905081810360008301526131968161315a565b90506131a560208301846126d5565b92915050565b7f5377617070696e67000000000000000000000000000000000000000000000000600082015250565b60006131e1600883612473565b91506131ec826131ab565b602082019050919050565b60006020820190508181036000830152613210816131d4565b9050919050565b7f546f6b656e7320746f20737761703a0000000000000000000000000000000000600082015250565b600061324d600f83612473565b915061325882613217565b602082019050919050565b6000604082019050818103600083015261327c81613240565b905061328b60208301846126d5565b92915050565b7f5377617070656420616e642073656e7420746f20666565000000000000000000600082015250565b60006132c7601783612473565b91506132d282613291565b602082019050919050565b600060208201905081810360008301526132f6816132ba565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61786960008201527f6d756d206c696d69740000000000000000000000000000000000000000000000602082015250565b6000613359602983612473565b9150613364826132fd565b604082019050919050565b600060208201905081810360008301526133888161334c565b9050919050565b600061339a82612582565b91506133a583612582565b92508282026133b381612582565b915082820484148315176133ca576133c9612c6a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061340b82612582565b915061341683612582565b925082613426576134256133d1565b5b828204905092915050565b600061343c82612582565b915061344783612582565b925082820390508181111561345f5761345e612c6a565b5b92915050565b7f54617820616d6f756e743a000000000000000000000000000000000000000000600082015250565b600061349b600b83612473565b91506134a682613465565b602082019050919050565b600060408201905081810360008301526134ca8161348e565b90506134d960208301846126d5565b92915050565b7f5472616e7366657220616d6f756e743a00000000000000000000000000000000600082015250565b6000613515601083612473565b9150613520826134df565b602082019050919050565b6000604082019050818103600083015261354481613508565b905061355360208301846126d5565b92915050565b600061356482612582565b915061356f83612582565b925082820190508082111561358757613586612c6a565b5b92915050565b6000819050919050565b60006135b26135ad6135a88461358d565b61265b565b612582565b9050919050565b6135c281613597565b82525050565b60006060820190506135dd60008301866126d5565b6135ea60208301856126d5565b6135f760408301846135b9565b949350505050565b7f5472616e7366657220746f2064657657616c6c6574206661696c656400000000600082015250565b6000613635601c83612473565b9150613640826135ff565b602082019050919050565b6000602082019050818103600083015261366481613628565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b60006136cd8261369a565b6136d78185612ce1565b93506136e2836136a5565b8060005b838110156137135781516136fa8882612d0b565b9750613705836136b5565b9250506001810190506136e6565b5085935050505092915050565b600060a08201905061373560008301886126d5565b61374260208301876135b9565b818103604083015261375481866136c2565b905061376360608301856127f4565b61377060808301846126d5565b969550505050505056fea2646970667358221220541797d602991ba48795fdef192a7c6ab95e931d14ddd77104ba6f955d5a33fb64736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000f5f08ba7f46e2a86b5ef3bfd56c2097c9f4276d70000000000000000000000007cb15a1216b749dfac79dd3038352ba1da94dcc4
-----Decoded View---------------
Arg [0] : _router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : _owner (address): 0xF5f08Ba7F46e2a86b5ef3BFD56c2097C9f4276D7
Arg [2] : _multisig (address): 0x7cb15a1216b749DFAC79dD3038352ba1DA94dcc4
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 000000000000000000000000f5f08ba7f46e2a86b5ef3bfd56c2097c9f4276d7
Arg [2] : 0000000000000000000000007cb15a1216b749dfac79dd3038352ba1da94dcc4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.