Feature Tip: Add private address tag to any address under My Name Tag !
Overview
Max Total Supply
1,218 OLT
Holders
50 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NFTVaultETH
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-23 */ // File: contracts/IWETH9.sol // contracts/IEIP4626.sol // Teahouse Finance pragma solidity ^0.8.0; interface IWETH9 { function name() external view returns (string memory); function symbol() external view returns (string memory); function deposit() external payable; function withdraw(uint wad) external; } // File: contracts/IEIP4626.sol // contracts/IEIP4626.sol // Teahouse Finance pragma solidity ^0.8.0; interface IEIP4626 { function asset() external view returns (address assetTokenAddress); function totalAssets() external view returns (uint256 totalManagedAssets); function convertToShares(uint256 assets) external view returns (uint256 shares); function convertToAssets(uint256 shares) external view returns (uint256 assets); function maxDeposit(address receiver) external view returns (uint256 maxAssets); function previewDeposit(uint256 assets) external view returns (uint256 shares); function deposit(uint256 assets, address receiver) external returns (uint256 shares); function maxMint(address receiver) external view returns (uint256 maxShares); function previewMint(uint256 shares) external view returns (uint256 assets); function mint(uint256 shares, address receiver) external returns (uint256 assets); function maxWithdraw(address owner) external view returns (uint256 maxAssets); function previewWithdraw(uint256 assets) external view returns (uint256 shares); function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares); function maxRedeem(address owner) external view returns (uint256 maxShares); function previewRedeem(uint256 shares) external view returns (uint256 assets); function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); event Deposit(address indexed caller, address indexed owner, uint256 assets, uint256 shares); event Withdraw(address indexed caller, address indexed receiver, address indexed owner, uint256 assets, uint256 shares); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/NFTVault.sol // contracts/NFTVault.sol // Teahouse Finance pragma solidity ^0.8.0; error ReceiverDoNotHasNFT(); error NFTNotEnabled(); error IncorrectReceiverAddress(); error IncorrectFundStage(); error ExceedMaxSupply(); error IncorrectFundValue(); /// @title A crowd funding vault for NFT investments /// @author Teahouse Finance contract NFTVault is Ownable, ReentrancyGuard, ERC20, IEIP4626 { using SafeERC20 for IERC20; /// @notice funding stages /// @notice Funding: initial funding stage, available for depositing /// @notice Onging: investment stage, not available for both depositing and withdrawal /// @notice Closed: closed stage, available for withdrawal enum FundStages { Funding, Ongoing, Closed } address internal assetToken; uint256 public initialPrice; uint256 public priceDenominator; uint256 public maxSupply; uint256 internal nominalValue; address[] public nftEnabled; FundStages public fundStage; event NFTEnabled(address indexed caller, address[] nfts); event FundFunding(address indexed caller, uint256 initialPrice, uint256 priceDenominator, uint256 maxSupply); event FundOngoing(address indexed caller, address indexed receiver, uint256 initialFundValue); event FundClosed(address indexed caller, uint256 finalFundValue); event FundValueChanged(address indexed caller, uint256 nominalValue); /// @param _name name of the vault token /// @param _symbol symbol of the vault token /// @param _asset address of the asset token /// @param _initialPrice initial price for each vault token in asset token /// @param _priceDenominator price denominator (actual price = _initialPrice / _priceDenominator) /// @param _maxSupply max supply of vault token constructor( string memory _name, string memory _symbol, address _asset, uint256 _initialPrice, uint256 _priceDenominator, uint256 _maxSupply) ERC20(_name, _symbol) { assetToken = _asset; initialPrice = _initialPrice; priceDenominator = _priceDenominator; maxSupply = _maxSupply; fundStage = FundStages.Funding; emit FundFunding(msg.sender, _initialPrice, _priceDenominator, _maxSupply); } /// @notice Set the list of NFTs for allowing depositing /// @param _nfts addresses of the NFTs function setEnabledNFTs(address[] memory _nfts) external onlyOwner { nftEnabled = _nfts; emit NFTEnabled(msg.sender, _nfts); } /// @notice Enter "Ongoing" stage. /// @notice can only do so when in "Funding" stage /// @notice will withdraw all asset tokens from the vault /// @param _receiver address to receive funds function enterOngoingStage(address _receiver) external nonReentrant onlyOwner { if (_receiver == address(0)) revert IncorrectReceiverAddress(); if (fundStage != FundStages.Funding) revert IncorrectFundStage(); uint256 balance = IERC20(assetToken).balanceOf(address(this)); IERC20(assetToken).safeTransfer(_receiver, balance); fundStage = FundStages.Ongoing; emit FundOngoing(msg.sender, _receiver, nominalValue); } /// @notice Enter "Closed" stage. /// @notice will transfer asset tokens to the vault /// @param _finalFundValue final fund value in asset token /// @notice if going directly from "Funding" stages to "Closed" stages, _finalFundValue must be 0 function enterClosedStage(uint256 _finalFundValue) external nonReentrant onlyOwner { if (fundStage == FundStages.Closed) revert IncorrectFundStage(); if (fundStage == FundStages.Ongoing) { IERC20(assetToken).safeTransferFrom(msg.sender, address(this), _finalFundValue); nominalValue = _finalFundValue; } else { if (_finalFundValue != 0) revert IncorrectFundValue(); } fundStage = FundStages.Closed; emit FundClosed(msg.sender, nominalValue); } /// @notice Update current nominalValue, for displying purpose only /// @notice only works in "Ongoing" stage /// @param _nominalValue nominal value in asset tokens function updateNominalValue(uint256 _nominalValue) external onlyOwner { if (fundStage != FundStages.Ongoing) revert IncorrectFundStage(); nominalValue = _nominalValue; emit FundValueChanged(msg.sender, nominalValue); } /// @return assetTokenAddress address of the asset token function asset() external override view returns (address assetTokenAddress) { return assetToken; } /// @return totalManagedAssets amount of asset tokens under management function totalAssets() external override view returns (uint256 totalManagedAssets) { return nominalValue; } /// @notice convert amount of assets to shares /// @param _assets amount of asset tokens /// @return shares amount of vault tokens function convertToShares(uint256 _assets) external override view returns (uint256 shares) { if (totalSupply() == 0) { // no assets deposited, use initialPrice return _assets * priceDenominator / initialPrice; } else { return totalSupply() * _assets / nominalValue; } } /// @notice convert amount of shares to assets /// @param _shares amount of vault tokens /// @return assets amount of asset tokens function convertToAssets(uint256 _shares) external override view returns (uint256 assets) { if (totalSupply() == 0) { // no assets deposited, use initialPrice return _shares * initialPrice / priceDenominator; } else { return (nominalValue * _shares) / totalSupply(); } } /// @notice Get maximum amount of asset tokens possible for deposit /// @param _receiver address of the receiver /// @return maxAssets maximum amount of assets allowed to be deposited function maxDeposit(address _receiver) external override view returns (uint256 maxAssets) { if (fundStage != FundStages.Funding) { return 0; } if (!_hasNFT(_receiver)) { // can't deposit if _receiver has no NFT return 0; } return (maxSupply - totalSupply()) * initialPrice / priceDenominator; } /// @notice Preview how much vault tokens will be received when depositing /// @param _assets amount of asset tokens to deposit /// @return shares estimated amount of vault tokens received function previewDeposit(uint256 _assets) public override view returns (uint256 shares) { if (fundStage != FundStages.Funding) revert IncorrectFundStage(); return _assets * priceDenominator / initialPrice; // round down } /// @notice Deposit into the vault /// @notice only works in "Funding" stage /// @param _assets amount of asset tokens to deposit /// @param _receiver address of the receiver /// @return shares amount of vault tokens received function deposit(uint256 _assets, address _receiver) external override nonReentrant returns (uint256 shares) { shares = previewDeposit(_assets); _internalMint(shares, _assets, true, _receiver); } /// @notice Get maximum amount of vault tokens possible for deposit /// @param _receiver address of the receiver /// @return maxShares maximum amount of vault tokens allowed to be received function maxMint(address _receiver) external override view returns (uint256 maxShares) { if (fundStage != FundStages.Funding) { return 0; } if (!_hasNFT(_receiver)) { // can't deposit if _receiver has no NFT return 0; } return maxSupply - totalSupply(); } /// @notice Preview how much asset tokens will be required when depositing /// @param _shares amount of vault tokens to receive /// @return assets estimated amount of asset tokens required function previewMint(uint256 _shares) public override view returns (uint256 assets) { if (fundStage != FundStages.Funding) revert IncorrectFundStage(); return (_shares * initialPrice + priceDenominator - 1) / priceDenominator; // round up } /// @notice Deposit into the vault /// @notice only works in "Funding" stage /// @param _shares amount of vault tokens to receive /// @param _receiver address of the receiver /// @return assets amount of asset tokens required function mint(uint256 _shares, address _receiver) external override nonReentrant returns (uint256 assets) { assets = previewMint(_shares); _internalMint(_shares, assets, true, _receiver); } /// @notice Get maximum amount of assets tokens possible for withdrawal /// @param _owner address of the owner /// @return maxAssets maximum amount of asset tokens can be received from withdrawal function maxWithdraw(address _owner) external override view returns (uint256 maxAssets) { if (fundStage != FundStages.Closed) { return 0; } return balanceOf(_owner) * nominalValue / totalSupply(); } /// @notice Preview how much vault tokens will be required when withdrawing /// @param _assets amount of asset tokens to receive /// @return shares estimated amount of vault tokens required function previewWithdraw(uint256 _assets) public override view returns (uint256 shares) { if (fundStage != FundStages.Closed) revert IncorrectFundStage(); return (totalSupply() * _assets + nominalValue - 1) / nominalValue; } /// @notice Withdraw from the vault /// @notice only works in "Closed" stage /// @param _assets amount of asset tokens to receive /// @param _receiver address of the receiver /// @param _owner address of the owner /// @return shares amount of vault tokens required /// @notice if the caller is not owner, owner must approved the caller for spending the vault tokens function withdraw(uint256 _assets, address _receiver, address _owner) external override nonReentrant returns (uint256 shares) { shares = previewWithdraw(_assets); _internalRedeem(shares, _assets, true, _receiver, _owner); } /// @notice Get maximum amount of vault tokens possible for withdrawal /// @param _owner address of the owner /// @return maxShares maximum amount of vault tokens allowed for withdrawal function maxRedeem(address _owner) external override view returns (uint256 maxShares) { if (fundStage != FundStages.Closed) { return 0; } return balanceOf(_owner); } /// @notice Preview how much asset tokens will be received from withdrawing /// @param _shares amount of vault tokens to withdraw /// @return assets estimated amount of asset tokens received function previewRedeem(uint256 _shares) public override view returns (uint256 assets) { if (fundStage != FundStages.Closed) revert IncorrectFundStage(); return (nominalValue * _shares) / totalSupply(); } /// @notice Withdraw from the vault /// @notice only works in "Closed" stage /// @param _shares amount of vault tokens to withdraw /// @param _receiver address of the receiver /// @param _owner address of the owner /// @return assets amount of asset tokens received /// @notice if the caller is not owner, owner must approved the caller for spending the vault tokens function redeem(uint256 _shares, address _receiver, address _owner) external override nonReentrant returns (uint256 assets) { assets = previewRedeem(_shares); _internalRedeem(_shares, assets, true, _receiver, _owner); } /// @notice internal mint helper /// @param _shares vault tokens to mint /// @param _assets asset tokens used for minting /// @param _transfer true to transfer the asset tokens, false if no transfer is needed /// @param _receiver address of the receiver function _internalMint(uint256 _shares, uint256 _assets, bool _transfer, address _receiver) internal { if (fundStage != FundStages.Funding) revert IncorrectFundStage(); if (!_hasNFT(_receiver)) revert ReceiverDoNotHasNFT(); if (_shares + totalSupply() > maxSupply) revert ExceedMaxSupply(); if (_transfer) { IERC20(assetToken).safeTransferFrom(msg.sender, address(this), _assets); } _mint(_receiver, _shares); nominalValue += _shares * initialPrice / priceDenominator; emit Deposit(msg.sender, _receiver, _assets, _shares); } /// @notice internal redeem helper /// @param _shares vault tokens to redeem /// @param _assets asset tokens received for redeeming /// @param _transfer true to transfer the asset tokens, false if no transfer is needed /// @param _receiver address of the receiver /// @param _owner address of the owner function _internalRedeem(uint256 _shares, uint256 _assets, bool _transfer, address _receiver, address _owner) internal { if (_receiver == address(0)) revert IncorrectReceiverAddress(); if (fundStage != FundStages.Closed) revert IncorrectFundStage(); if (_owner != msg.sender) { _spendAllowance(_owner, msg.sender, _shares); } _burn(_owner, _shares); nominalValue -= _assets; if (_transfer) { IERC20(assetToken).safeTransfer(_receiver, _assets); } emit Withdraw(msg.sender, _receiver, _owner, _assets, _shares); } /// @notice internal NFT checker /// @param _receiver address of the receiver /// @return hasNFT true if the receiver has at least one of the NFT, false if not function _hasNFT(address _receiver) internal view returns (bool hasNFT) { uint256 i; for (i = 0; i < nftEnabled.length; i++) { if (IERC721(nftEnabled[i]).balanceOf(_receiver) > 0) { break; } } return i < nftEnabled.length; } } // File: contracts/NFTVaultETH.sol // contracts/NFTVaultETH.sol // Teahouse Finance pragma solidity ^0.8.0; error AssetNotWETH9(); error NotEnoughETH(); error NotAcceptingETH(); /// @title A crowd funding vault for NFT investments accepting ETH /// @notice using WETH as the ERC20 token /// @author Teahouse Finance contract NFTVaultETH is NFTVault { constructor( string memory _name, string memory _symbol, address _weth9, uint256 _initialPrice, uint256 _priceDenominator, uint256 _maxSupply) NFTVault(_name, _symbol, _weth9, _initialPrice, _priceDenominator, _maxSupply) { // check _weth9 is actually WETH if (keccak256(abi.encode(IWETH9(_weth9).symbol())) != keccak256(abi.encode("WETH"))) revert AssetNotWETH9(); } receive() external payable { // only accepts ETH from weth9 if (msg.sender != assetToken) revert NotAcceptingETH(); } /// @notice Enter "Ongoing" stage, using ETH /// @notice can only do so when in "Funding" stage /// @notice will withdraw all asset tokens and convert to ETH from the vault /// @param _receiver address to receive funds function enterOngoingStageETH(address payable _receiver) external nonReentrant onlyOwner { if (_receiver == address(0)) revert IncorrectReceiverAddress(); if (fundStage != FundStages.Funding) revert IncorrectFundStage(); uint256 balance = IERC20(assetToken).balanceOf(address(this)); IWETH9(assetToken).withdraw(balance); Address.sendValue(_receiver, balance); fundStage = FundStages.Ongoing; emit FundOngoing(msg.sender, _receiver, nominalValue); } /// @notice Enter "Closed" stage. /// @notice will transfer ETH to the vault and convert to asset token /// @param _finalFundValue final fund value in ETH /// @notice if going directly from "Funding" stages to "Closed" stages, _finalFundValue must be 0 function enterClosedStageETH(uint256 _finalFundValue) external payable nonReentrant onlyOwner { if (fundStage == FundStages.Closed) revert IncorrectFundStage(); if (fundStage == FundStages.Ongoing) { if (msg.value != _finalFundValue) revert NotEnoughETH(); IWETH9(assetToken).deposit{ value: msg.value }(); nominalValue = _finalFundValue; } else { if (_finalFundValue != 0 || msg.value != 0) revert IncorrectFundValue(); } fundStage = FundStages.Closed; emit FundClosed(msg.sender, nominalValue); } /// @notice Deposit into the vault, in ETH /// @notice only works in "Funding" stage /// @param _assets amount of ETH to deposit /// @param _receiver address of the receiver /// @return shares amount of vault tokens received function depositETH(uint256 _assets, address _receiver) external payable nonReentrant returns (uint256 shares) { if (msg.value != _assets) revert NotEnoughETH(); IWETH9(assetToken).deposit{ value: msg.value }(); shares = previewDeposit(_assets); _internalMint(shares, _assets, false, _receiver); } /// @notice Deposit into the vault, in ETH /// @notice only works in "Funding" stage /// @param _shares amount of vault tokens to receive /// @param _receiver address of the receiver /// @return assets amount of asset tokens required function mintETH(uint256 _shares, address _receiver) external payable nonReentrant returns (uint256 assets) { assets = previewMint(_shares); if (msg.value < assets) revert NotEnoughETH(); uint256 remain = msg.value - assets; if (remain > 0) { // send remaining ETH back to the sender Address.sendValue(payable(msg.sender), remain); } IWETH9(assetToken).deposit{ value: assets }(); _internalMint(_shares, assets, false, _receiver); } /// @notice Withdraw from the vault, in ETH /// @notice only works in "Closed" stage /// @param _assets amount of asset tokens to receive /// @param _receiver address of the receiver /// @param _owner address of the owner /// @return shares amount of vault tokens required /// @notice if the caller is not owner, owner must approved the caller for spending the vault tokens function withdrawETH(uint256 _assets, address payable _receiver, address _owner) external nonReentrant returns (uint256 shares) { shares = (totalSupply() * _assets + nominalValue - 1) / nominalValue; _internalRedeem(shares, _assets, false, _receiver, _owner); IWETH9(assetToken).withdraw(_assets); Address.sendValue(_receiver, _assets); } /// @notice Withdraw from the vault, in ETH /// @notice only works in "Closed" stage /// @param _shares amount of vault tokens to withdraw /// @param _receiver address of the receiver /// @param _owner address of the owner /// @return assets amount of asset tokens received /// @notice if the caller is not owner, owner must approved the caller for spending the vault tokens function redeemETH(uint256 _shares, address payable _receiver, address _owner) external nonReentrant returns (uint256 assets) { assets = (nominalValue * _shares) / totalSupply(); _internalRedeem(_shares, assets, false, _receiver, _owner); IWETH9(assetToken).withdraw(assets); Address.sendValue(_receiver, assets); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_weth9","type":"address"},{"internalType":"uint256","name":"_initialPrice","type":"uint256"},{"internalType":"uint256","name":"_priceDenominator","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AssetNotWETH9","type":"error"},{"inputs":[],"name":"ExceedMaxSupply","type":"error"},{"inputs":[],"name":"IncorrectFundStage","type":"error"},{"inputs":[],"name":"IncorrectFundValue","type":"error"},{"inputs":[],"name":"IncorrectReceiverAddress","type":"error"},{"inputs":[],"name":"NotAcceptingETH","type":"error"},{"inputs":[],"name":"NotEnoughETH","type":"error"},{"inputs":[],"name":"ReceiverDoNotHasNFT","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":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"finalFundValue","type":"uint256"}],"name":"FundClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"initialPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceDenominator","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"FundFunding","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"initialFundValue","type":"uint256"}],"name":"FundOngoing","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"nominalValue","type":"uint256"}],"name":"FundValueChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"address[]","name":"nfts","type":"address[]"}],"name":"NFTEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"assetTokenAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"depositETH","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_finalFundValue","type":"uint256"}],"name":"enterClosedStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_finalFundValue","type":"uint256"}],"name":"enterClosedStageETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"enterOngoingStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_receiver","type":"address"}],"name":"enterOngoingStageETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fundStage","outputs":[{"internalType":"enum NFTVault.FundStages","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"maxAssets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"maxShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"maxShares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"maxAssets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintETH","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftEnabled","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"address payable","name":"_receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"redeemETH","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_nfts","type":"address[]"}],"name":"setEnabledNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"totalManagedAssets","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nominalValue","type":"uint256"}],"name":"updateNominalValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_assets","type":"uint256"},{"internalType":"address payable","name":"_receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"withdrawETH","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200427e3803806200427e83398101604081905262000034916200030d565b85858585858585856200004733620001e3565b60018055600562000059838262000445565b50600662000068828262000445565b5050600780546001600160a01b0319166001600160a01b0387161790555060088390556009829055600a819055600d805460ff191690556040805184815260208101849052808201839052905133917fa2ac3c0c7dcccc371223001cbf2b6ec737209ec2700848f5f346e867522bf81a919081900360600190a250505050505060405160200162000111906020808252600490820152630ae8aa8960e31b604082015260600190565b60405160208183030381529060405280519060200120846001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000166573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000190919081019062000511565b604051602001620001a2919062000551565b6040516020818303038152906040528051906020012014620001d7576040516338d4484b60e21b815260040160405180910390fd5b50505050505062000586565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620002665781810151838201526020016200024c565b8381111562000276576000848401525b50505050565b600082601f8301126200028e57600080fd5b81516001600160401b0380821115620002ab57620002ab62000233565b604051601f8301601f19908116603f01168101908282118183101715620002d657620002d662000233565b81604052838152866020858801011115620002f057600080fd5b6200030384602083016020890162000249565b9695505050505050565b60008060008060008060c087890312156200032757600080fd5b86516001600160401b03808211156200033f57600080fd5b6200034d8a838b016200027c565b975060208901519150808211156200036457600080fd5b506200037389828a016200027c565b604089015190965090506001600160a01b03811681146200039357600080fd5b80945050606087015192506080870151915060a087015190509295509295509295565b600181811c90821680620003cb57607f821691505b602082108103620003ec57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200044057600081815260208120601f850160051c810160208610156200041b5750805b601f850160051c820191505b818110156200043c5782815560010162000427565b5050505b505050565b81516001600160401b0381111562000461576200046162000233565b6200047981620004728454620003b6565b84620003f2565b602080601f831160018114620004b15760008415620004985750858301515b600019600386901b1c1916600185901b1785556200043c565b600085815260208120601f198616915b82811015620004e257888601518255948401946001909101908401620004c1565b5085821015620005015787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200052457600080fd5b81516001600160401b038111156200053b57600080fd5b62000549848285016200027c565b949350505050565b60208152600082518060208401526200057281604085016020870162000249565b601f01601f19169190910160400192915050565b613ce880620005966000396000f3fe6080604052600436106102f65760003560e01c8063715018a61161018f578063c63d75b6116100e1578063d905777e1161008a578063ef8b30f711610064578063ef8b30f7146108d7578063f2fde38b146108f7578063f38e69a61461091757600080fd5b8063d905777e14610844578063dd62ed3e14610864578063eb000f31146108b757600080fd5b8063ce96cb77116100bb578063ce96cb77146107fb578063cfc13da61461081b578063d5abeb011461082e57600080fd5b8063c63d75b6146107a5578063c6e6f592146107c5578063cdcf4b9b146107e557600080fd5b8063a9059cbb11610143578063ba0876521161011d578063ba0876521461073e578063bb873fd31461075e578063c099ad101461078557600080fd5b8063a9059cbb146106de578063b3d7f6b9146106fe578063b460af941461071e57600080fd5b806394bf804d1161017457806394bf804d1461068957806395d89b41146106a9578063a457c2d7146106be57600080fd5b8063715018a6146106495780638da5cb5b1461065e57600080fd5b8063313ce567116102485780634cdad506116101fc5780636b6f5133116101d65780636b6f5133146105c65780636e553f65146105e657806370a082311461060657600080fd5b80634cdad5061461057357806356150edf1461059357806367da598e146105a657600080fd5b8063395093511161022d5780633950935114610513578063402d267d146105335780634643d4241461055357600080fd5b8063313ce567146104cc57806338d52e0f146104e857600080fd5b80630a28a477116102aa57806318160ddd1161028457806318160ddd146104815780631d0806ae1461049657806323b872dd146104ac57600080fd5b80630a28a4771461042e5780630e04a5d51461044e5780630ebee9c51461046e57600080fd5b806306fdde03116102db57806306fdde03146103bc57806307a2d13a146103de578063095ea7b3146103fe57600080fd5b806301e1d1141461035357806306297eab1461037757600080fd5b3661034e5760075473ffffffffffffffffffffffffffffffffffffffff16331461034c576040517f28852de200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b600080fd5b34801561035f57600080fd5b50600b545b6040519081526020015b60405180910390f35b34801561038357600080fd5b50610397610392366004613702565b610937565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161036e565b3480156103c857600080fd5b506103d161096e565b60405161036e9190613747565b3480156103ea57600080fd5b506103646103f9366004613702565b610a00565b34801561040a57600080fd5b5061041e6104193660046137c5565b610a48565b604051901515815260200161036e565b34801561043a57600080fd5b50610364610449366004613702565b610a60565b34801561045a57600080fd5b5061034c6104693660046137f1565b610ae0565b61034c61047c366004613702565b610db1565b34801561048d57600080fd5b50600454610364565b3480156104a257600080fd5b5061036460085481565b3480156104b857600080fd5b5061041e6104c736600461380e565b611086565b3480156104d857600080fd5b506040516012815260200161036e565b3480156104f457600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff16610397565b34801561051f57600080fd5b5061041e61052e3660046137c5565b6110ac565b34801561053f57600080fd5b5061036461054e3660046137f1565b6110f8565b34801561055f57600080fd5b5061034c61056e36600461387e565b611154565b34801561057f57600080fd5b5061036461058e366004613702565b61123a565b6103646105a1366004613961565b61128c565b3480156105b257600080fd5b506103646105c1366004613991565b6113dd565b3480156105d257600080fd5b506103646105e1366004613991565b611532565b3480156105f257600080fd5b50610364610601366004613961565b61165e565b34801561061257600080fd5b506103646106213660046137f1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b34801561065557600080fd5b5061034c6116e9565b34801561066a57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610397565b34801561069557600080fd5b506103646106a4366004613961565b611776565b3480156106b557600080fd5b506103d1611801565b3480156106ca57600080fd5b5061041e6106d93660046137c5565b611810565b3480156106ea57600080fd5b5061041e6106f93660046137c5565b6118ec565b34801561070a57600080fd5b50610364610719366004613702565b6118fa565b34801561072a57600080fd5b50610364610739366004613991565b611961565b34801561074a57600080fd5b50610364610759366004613991565b6119ed565b34801561076a57600080fd5b50600d546107789060ff1681565b60405161036e9190613a02565b34801561079157600080fd5b5061034c6107a0366004613702565b611a79565b3480156107b157600080fd5b506103646107c03660046137f1565b611b81565b3480156107d157600080fd5b506103646107e0366004613702565b611bcd565b3480156107f157600080fd5b5061036460095481565b34801561080757600080fd5b506103646108163660046137f1565b611bfc565b610364610829366004613961565b611c55565b34801561083a57600080fd5b50610364600a5481565b34801561085057600080fd5b5061036461085f3660046137f1565b611dc6565b34801561087057600080fd5b5061036461087f366004613a43565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205490565b3480156108c357600080fd5b5061034c6108d2366004613702565b611e19565b3480156108e357600080fd5b506103646108f2366004613702565b611fe0565b34801561090357600080fd5b5061034c6109123660046137f1565b612041565b34801561092357600080fd5b5061034c6109323660046137f1565b612171565b600c818154811061094757600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60606005805461097d90613a71565b80601f01602080910402602001604051908101604052809291908181526020018280546109a990613a71565b80156109f65780601f106109cb576101008083540402835291602001916109f6565b820191906000526020600020905b8154815290600101906020018083116109d957829003601f168201915b5050505050905090565b6000610a0b60045490565b600003610a3257600954600854610a229084613af3565b610a2c9190613b30565b92915050565b60045482600b54610a229190613af3565b919050565b600033610a56818585612422565b5060019392505050565b60006002600d5460ff166002811115610a7b57610a7b6139d3565b14610ab2576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5460018184610ac260045490565b610acc9190613af3565b610ad69190613b6b565b610a229190613b83565b600260015403610b51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b600260015560005473ffffffffffffffffffffffffffffffffffffffff163314610bd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b73ffffffffffffffffffffffffffffffffffffffff8116610c24576040517fddc87b6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600d5460ff166002811115610c3d57610c3d6139d3565b14610c74576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d079190613b9a565b600754909150610d2e9073ffffffffffffffffffffffffffffffffffffffff1683836125d5565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600b5460405190815273ffffffffffffffffffffffffffffffffffffffff83169033907ff244e79e09091f1d0319e68d47bdefc6380bb06e0abb03774f38b65c8dea3afb9060200160405180910390a3505060018055565b600260015403610e1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b600260015560005473ffffffffffffffffffffffffffffffffffffffff163314610ea3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b6002600d5460ff166002811115610ebc57610ebc6139d3565b03610ef3576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600d5460ff166002811115610f0c57610f0c6139d3565b03610fd857803414610f4a576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b505050600b8390555061101c9050565b80151580610fe557503415155b1561101c576040517f1df5bd4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055600b5460405190815233907f2e93bf24f0f12147aa1d0da689c1cf71d988b00f99c696ae801e5d888b789d879060200160405180910390a25060018055565b6000336110948582856126ae565b61109f858585612785565b60019150505b9392505050565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190610a5690829086906110f3908790613b6b565b612422565b600080600d5460ff166002811115611112576111126139d3565b1461111f57506000919050565b61112882612a38565b61113457506000919050565b600954600854600454600a5461114a9190613b83565b610a229190613af3565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b80516111e890600c906020840190613663565b503373ffffffffffffffffffffffffffffffffffffffff167f34d3b61e6bffec50c4a258febfd2d202a0535a781ecc2f755749aea546bf54698260405161122f9190613bb3565b60405180910390a250565b60006002600d5460ff166002811115611255576112556139d3565b14610a32576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002600154036112fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b6002600155348314611338576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156113a257600080fd5b505af11580156113b6573d6000803e3d6000fd5b50505050506113c483611fe0565b90506113d38184600085612b19565b6001805592915050565b600060026001540361144b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b60026001908155600b5490818661146160045490565b61146b9190613af3565b6114759190613b6b565b61147f9190613b83565b6114899190613b30565b9050611499818560008686612cae565b6007546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810186905273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90602401600060405180830381600087803b15801561150557600080fd5b505af1158015611519573d6000803e3d6000fd5b505050506115278385612e1d565b600180559392505050565b60006002600154036115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b600260015560045484600b546115b69190613af3565b6115c09190613b30565b90506115d0848260008686612cae565b6007546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90602401600060405180830381600087803b15801561163c57600080fd5b505af1158015611650573d6000803e3d6000fd5b505050506115278382612e1d565b60006002600154036116cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b60026001556116da83611fe0565b90506113d38184600185612b19565b60005473ffffffffffffffffffffffffffffffffffffffff16331461176a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b6117746000612f77565b565b60006002600154036117e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b60026001556117f2836118fa565b90506113d38382600185612b19565b60606006805461097d90613a71565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156118d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610b48565b6118e18286868403612422565b506001949350505050565b600033610a56818585612785565b600080600d5460ff166002811115611914576119146139d3565b1461194b576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600954600160095460085485610acc9190613af3565b60006002600154036119cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b60026001556119dd84610a60565b9050611527818560018686612cae565b6000600260015403611a5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b6002600155611a698461123a565b9050611527848260018686612cae565b60005473ffffffffffffffffffffffffffffffffffffffff163314611afa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b6001600d5460ff166002811115611b1357611b136139d3565b14611b4a576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b81905560405181815233907f28b4afe8fee0dcf6143f794915475c2f046b814a2d4ac744c81f93c441e7a52a9060200161122f565b600080600d5460ff166002811115611b9b57611b9b6139d3565b14611ba857506000919050565b611bb182612a38565b611bbd57506000919050565b600454600a54610a2c9190613b83565b6000611bd860045490565b600003611bef57600854600954610a229084613af3565b600b548261114a60045490565b60006002600d5460ff166002811115611c1757611c176139d3565b14611c2457506000919050565b600454600b5473ffffffffffffffffffffffffffffffffffffffff841660009081526002602052604090205461114a565b6000600260015403611cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b6002600155611cd1836118fa565b905080341015611d0d576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611d198234613b83565b90508015611d2b57611d2b3382612e1d565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d9557600080fd5b505af1158015611da9573d6000803e3d6000fd5b5050505050611dbb8483600086612b19565b506001805592915050565b60006002600d5460ff166002811115611de157611de16139d3565b14611dee57506000919050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054610a2c565b600260015403611e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b600260015560005473ffffffffffffffffffffffffffffffffffffffff163314611f0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b6002600d5460ff166002811115611f2457611f246139d3565b03611f5b576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600d5460ff166002811115611f7457611f746139d3565b03611fa857600754611f9e9073ffffffffffffffffffffffffffffffffffffffff16333084612fec565b600b81905561101c565b801561101c576040517f1df5bd4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600d5460ff166002811115611ffa57611ffa6139d3565b14612031576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600854600954610a229084613af3565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b73ffffffffffffffffffffffffffffffffffffffff8116612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b48565b61216e81612f77565b50565b6002600154036121dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b600260015560005473ffffffffffffffffffffffffffffffffffffffff163314612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b73ffffffffffffffffffffffffffffffffffffffff81166122b0576040517fddc87b6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600d5460ff1660028111156122c9576122c96139d3565b14612300576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561236f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123939190613b9a565b6007546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810183905291925073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561240057600080fd5b505af1158015612414573d6000803e3d6000fd5b50505050610d2e8282612e1d565b73ffffffffffffffffffffffffffffffffffffffff83166124c4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff8216612567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526126a99084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261304a565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600360209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461277f5781811015612772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b48565b61277f8484848403612422565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316612828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff82166128cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604090205481811015612981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260205260408082208585039055918516815290812080548492906129c5908490613b6b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612a2b91815260200190565b60405180910390a361277f565b6000805b600c54811015612b0f576000600c8281548110612a5b57612a5b613c0d565b6000918252602090912001546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152909116906370a0823190602401602060405180830381865afa158015612ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af89190613b9a565b11612b0f5780612b0781613c3c565b915050612a3c565b600c541192915050565b6000600d5460ff166002811115612b3257612b326139d3565b14612b69576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b7281612a38565b612ba8576040517f7a1018f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a54600454612bb89086613b6b565b1115612bf0576040517f1e186f7200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8115612c1b57600754612c1b9073ffffffffffffffffffffffffffffffffffffffff16333086612fec565b612c258185613156565b600954600854612c359086613af3565b612c3f9190613b30565b600b6000828254612c509190613b6b565b9091555050604080518481526020810186905273ffffffffffffffffffffffffffffffffffffffff83169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216612cfb576040517fddc87b6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600d5460ff166002811115612d1457612d146139d3565b14612d4b576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81163314612d7357612d738133876126ae565b612d7d8186613276565b83600b6000828254612d8f9190613b83565b90915550508215612dbe57600754612dbe9073ffffffffffffffffffffffffffffffffffffffff1683866125d5565b604080518581526020810187905273ffffffffffffffffffffffffffffffffffffffff808416929085169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a45050505050565b80471015612e87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b48565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612ee1576040519150601f19603f3d011682016040523d82523d6000602084013e612ee6565b606091505b50509050806126a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b48565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261277f9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612627565b60006130ac826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134639092919063ffffffff16565b8051909150156126a957808060200190518101906130ca9190613c74565b6126a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff82166131d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610b48565b80600460008282546131e59190613b6b565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260408120805483929061321f908490613b6b565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216613319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054818110156133cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812083830390556004805484929061340b908490613b83565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6060613472848460008561347a565b949350505050565b60608247101561350c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff85163b61358a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b48565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135b39190613c96565b60006040518083038185875af1925050503d80600081146135f0576040519150601f19603f3d011682016040523d82523d6000602084013e6135f5565b606091505b5091509150613605828286613610565b979650505050505050565b6060831561361f5750816110a5565b82511561362f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b489190613747565b8280548282559060005260206000209081019282156136dd579160200282015b828111156136dd57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190613683565b506136e99291506136ed565b5090565b5b808211156136e957600081556001016136ee565b60006020828403121561371457600080fd5b5035919050565b60005b8381101561373657818101518382015260200161371e565b8381111561277f5750506000910152565b602081526000825180602084015261376681604085016020870161371b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461216e57600080fd5b8035610a4381613798565b600080604083850312156137d857600080fd5b82356137e381613798565b946020939093013593505050565b60006020828403121561380357600080fd5b81356110a581613798565b60008060006060848603121561382357600080fd5b833561382e81613798565b9250602084013561383e81613798565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602080838503121561389157600080fd5b823567ffffffffffffffff808211156138a957600080fd5b818501915085601f8301126138bd57600080fd5b8135818111156138cf576138cf61384f565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156139125761391261384f565b60405291825284820192508381018501918883111561393057600080fd5b938501935b8285101561395557613946856137ba565b84529385019392850192613935565b98975050505050505050565b6000806040838503121561397457600080fd5b82359150602083013561398681613798565b809150509250929050565b6000806000606084860312156139a657600080fd5b8335925060208401356139b881613798565b915060408401356139c881613798565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613a3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060408385031215613a5657600080fd5b8235613a6181613798565b9150602083013561398681613798565b600181811c90821680613a8557607f821691505b602082108103613abe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b2b57613b2b613ac4565b500290565b600082613b66577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115613b7e57613b7e613ac4565b500190565b600082821015613b9557613b95613ac4565b500390565b600060208284031215613bac57600080fd5b5051919050565b6020808252825182820181905260009190848201906040850190845b81811015613c0157835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613bcf565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c6d57613c6d613ac4565b5060010190565b600060208284031215613c8657600080fd5b815180151581146110a557600080fd5b60008251613ca881846020870161371b565b919091019291505056fea2646970667358221220278cee26ccc30daa8bb6f55d31d0a0cdc7ea4a072c0cdc957bd0425b820468c264736f6c634300080f003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000000000000000000000c4f6f6c6f6e6720746f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f4c540000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102f65760003560e01c8063715018a61161018f578063c63d75b6116100e1578063d905777e1161008a578063ef8b30f711610064578063ef8b30f7146108d7578063f2fde38b146108f7578063f38e69a61461091757600080fd5b8063d905777e14610844578063dd62ed3e14610864578063eb000f31146108b757600080fd5b8063ce96cb77116100bb578063ce96cb77146107fb578063cfc13da61461081b578063d5abeb011461082e57600080fd5b8063c63d75b6146107a5578063c6e6f592146107c5578063cdcf4b9b146107e557600080fd5b8063a9059cbb11610143578063ba0876521161011d578063ba0876521461073e578063bb873fd31461075e578063c099ad101461078557600080fd5b8063a9059cbb146106de578063b3d7f6b9146106fe578063b460af941461071e57600080fd5b806394bf804d1161017457806394bf804d1461068957806395d89b41146106a9578063a457c2d7146106be57600080fd5b8063715018a6146106495780638da5cb5b1461065e57600080fd5b8063313ce567116102485780634cdad506116101fc5780636b6f5133116101d65780636b6f5133146105c65780636e553f65146105e657806370a082311461060657600080fd5b80634cdad5061461057357806356150edf1461059357806367da598e146105a657600080fd5b8063395093511161022d5780633950935114610513578063402d267d146105335780634643d4241461055357600080fd5b8063313ce567146104cc57806338d52e0f146104e857600080fd5b80630a28a477116102aa57806318160ddd1161028457806318160ddd146104815780631d0806ae1461049657806323b872dd146104ac57600080fd5b80630a28a4771461042e5780630e04a5d51461044e5780630ebee9c51461046e57600080fd5b806306fdde03116102db57806306fdde03146103bc57806307a2d13a146103de578063095ea7b3146103fe57600080fd5b806301e1d1141461035357806306297eab1461037757600080fd5b3661034e5760075473ffffffffffffffffffffffffffffffffffffffff16331461034c576040517f28852de200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b600080fd5b34801561035f57600080fd5b50600b545b6040519081526020015b60405180910390f35b34801561038357600080fd5b50610397610392366004613702565b610937565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161036e565b3480156103c857600080fd5b506103d161096e565b60405161036e9190613747565b3480156103ea57600080fd5b506103646103f9366004613702565b610a00565b34801561040a57600080fd5b5061041e6104193660046137c5565b610a48565b604051901515815260200161036e565b34801561043a57600080fd5b50610364610449366004613702565b610a60565b34801561045a57600080fd5b5061034c6104693660046137f1565b610ae0565b61034c61047c366004613702565b610db1565b34801561048d57600080fd5b50600454610364565b3480156104a257600080fd5b5061036460085481565b3480156104b857600080fd5b5061041e6104c736600461380e565b611086565b3480156104d857600080fd5b506040516012815260200161036e565b3480156104f457600080fd5b5060075473ffffffffffffffffffffffffffffffffffffffff16610397565b34801561051f57600080fd5b5061041e61052e3660046137c5565b6110ac565b34801561053f57600080fd5b5061036461054e3660046137f1565b6110f8565b34801561055f57600080fd5b5061034c61056e36600461387e565b611154565b34801561057f57600080fd5b5061036461058e366004613702565b61123a565b6103646105a1366004613961565b61128c565b3480156105b257600080fd5b506103646105c1366004613991565b6113dd565b3480156105d257600080fd5b506103646105e1366004613991565b611532565b3480156105f257600080fd5b50610364610601366004613961565b61165e565b34801561061257600080fd5b506103646106213660046137f1565b73ffffffffffffffffffffffffffffffffffffffff1660009081526002602052604090205490565b34801561065557600080fd5b5061034c6116e9565b34801561066a57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610397565b34801561069557600080fd5b506103646106a4366004613961565b611776565b3480156106b557600080fd5b506103d1611801565b3480156106ca57600080fd5b5061041e6106d93660046137c5565b611810565b3480156106ea57600080fd5b5061041e6106f93660046137c5565b6118ec565b34801561070a57600080fd5b50610364610719366004613702565b6118fa565b34801561072a57600080fd5b50610364610739366004613991565b611961565b34801561074a57600080fd5b50610364610759366004613991565b6119ed565b34801561076a57600080fd5b50600d546107789060ff1681565b60405161036e9190613a02565b34801561079157600080fd5b5061034c6107a0366004613702565b611a79565b3480156107b157600080fd5b506103646107c03660046137f1565b611b81565b3480156107d157600080fd5b506103646107e0366004613702565b611bcd565b3480156107f157600080fd5b5061036460095481565b34801561080757600080fd5b506103646108163660046137f1565b611bfc565b610364610829366004613961565b611c55565b34801561083a57600080fd5b50610364600a5481565b34801561085057600080fd5b5061036461085f3660046137f1565b611dc6565b34801561087057600080fd5b5061036461087f366004613a43565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260036020908152604080832093909416825291909152205490565b3480156108c357600080fd5b5061034c6108d2366004613702565b611e19565b3480156108e357600080fd5b506103646108f2366004613702565b611fe0565b34801561090357600080fd5b5061034c6109123660046137f1565b612041565b34801561092357600080fd5b5061034c6109323660046137f1565b612171565b600c818154811061094757600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60606005805461097d90613a71565b80601f01602080910402602001604051908101604052809291908181526020018280546109a990613a71565b80156109f65780601f106109cb576101008083540402835291602001916109f6565b820191906000526020600020905b8154815290600101906020018083116109d957829003601f168201915b5050505050905090565b6000610a0b60045490565b600003610a3257600954600854610a229084613af3565b610a2c9190613b30565b92915050565b60045482600b54610a229190613af3565b919050565b600033610a56818585612422565b5060019392505050565b60006002600d5460ff166002811115610a7b57610a7b6139d3565b14610ab2576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b5460018184610ac260045490565b610acc9190613af3565b610ad69190613b6b565b610a229190613b83565b600260015403610b51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b600260015560005473ffffffffffffffffffffffffffffffffffffffff163314610bd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b73ffffffffffffffffffffffffffffffffffffffff8116610c24576040517fddc87b6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600d5460ff166002811115610c3d57610c3d6139d3565b14610c74576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d079190613b9a565b600754909150610d2e9073ffffffffffffffffffffffffffffffffffffffff1683836125d5565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055600b5460405190815273ffffffffffffffffffffffffffffffffffffffff83169033907ff244e79e09091f1d0319e68d47bdefc6380bb06e0abb03774f38b65c8dea3afb9060200160405180910390a3505060018055565b600260015403610e1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b600260015560005473ffffffffffffffffffffffffffffffffffffffff163314610ea3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b6002600d5460ff166002811115610ebc57610ebc6139d3565b03610ef3576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600d5460ff166002811115610f0c57610f0c6139d3565b03610fd857803414610f4a576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b505050600b8390555061101c9050565b80151580610fe557503415155b1561101c576040517f1df5bd4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166002179055600b5460405190815233907f2e93bf24f0f12147aa1d0da689c1cf71d988b00f99c696ae801e5d888b789d879060200160405180910390a25060018055565b6000336110948582856126ae565b61109f858585612785565b60019150505b9392505050565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190610a5690829086906110f3908790613b6b565b612422565b600080600d5460ff166002811115611112576111126139d3565b1461111f57506000919050565b61112882612a38565b61113457506000919050565b600954600854600454600a5461114a9190613b83565b610a229190613af3565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b80516111e890600c906020840190613663565b503373ffffffffffffffffffffffffffffffffffffffff167f34d3b61e6bffec50c4a258febfd2d202a0535a781ecc2f755749aea546bf54698260405161122f9190613bb3565b60405180910390a250565b60006002600d5460ff166002811115611255576112556139d3565b14610a32576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006002600154036112fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b6002600155348314611338576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156113a257600080fd5b505af11580156113b6573d6000803e3d6000fd5b50505050506113c483611fe0565b90506113d38184600085612b19565b6001805592915050565b600060026001540361144b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b60026001908155600b5490818661146160045490565b61146b9190613af3565b6114759190613b6b565b61147f9190613b83565b6114899190613b30565b9050611499818560008686612cae565b6007546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810186905273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90602401600060405180830381600087803b15801561150557600080fd5b505af1158015611519573d6000803e3d6000fd5b505050506115278385612e1d565b600180559392505050565b60006002600154036115a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b600260015560045484600b546115b69190613af3565b6115c09190613b30565b90506115d0848260008686612cae565b6007546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff90911690632e1a7d4d90602401600060405180830381600087803b15801561163c57600080fd5b505af1158015611650573d6000803e3d6000fd5b505050506115278382612e1d565b60006002600154036116cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b60026001556116da83611fe0565b90506113d38184600185612b19565b60005473ffffffffffffffffffffffffffffffffffffffff16331461176a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b6117746000612f77565b565b60006002600154036117e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b60026001556117f2836118fa565b90506113d38382600185612b19565b60606006805461097d90613a71565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156118d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610b48565b6118e18286868403612422565b506001949350505050565b600033610a56818585612785565b600080600d5460ff166002811115611914576119146139d3565b1461194b576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600954600160095460085485610acc9190613af3565b60006002600154036119cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b60026001556119dd84610a60565b9050611527818560018686612cae565b6000600260015403611a5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b6002600155611a698461123a565b9050611527848260018686612cae565b60005473ffffffffffffffffffffffffffffffffffffffff163314611afa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b6001600d5460ff166002811115611b1357611b136139d3565b14611b4a576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b81905560405181815233907f28b4afe8fee0dcf6143f794915475c2f046b814a2d4ac744c81f93c441e7a52a9060200161122f565b600080600d5460ff166002811115611b9b57611b9b6139d3565b14611ba857506000919050565b611bb182612a38565b611bbd57506000919050565b600454600a54610a2c9190613b83565b6000611bd860045490565b600003611bef57600854600954610a229084613af3565b600b548261114a60045490565b60006002600d5460ff166002811115611c1757611c176139d3565b14611c2457506000919050565b600454600b5473ffffffffffffffffffffffffffffffffffffffff841660009081526002602052604090205461114a565b6000600260015403611cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b6002600155611cd1836118fa565b905080341015611d0d576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611d198234613b83565b90508015611d2b57611d2b3382612e1d565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d9557600080fd5b505af1158015611da9573d6000803e3d6000fd5b5050505050611dbb8483600086612b19565b506001805592915050565b60006002600d5460ff166002811115611de157611de16139d3565b14611dee57506000919050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054610a2c565b600260015403611e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b600260015560005473ffffffffffffffffffffffffffffffffffffffff163314611f0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b6002600d5460ff166002811115611f2457611f246139d3565b03611f5b576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600d5460ff166002811115611f7457611f746139d3565b03611fa857600754611f9e9073ffffffffffffffffffffffffffffffffffffffff16333084612fec565b600b81905561101c565b801561101c576040517f1df5bd4000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600d5460ff166002811115611ffa57611ffa6139d3565b14612031576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600854600954610a229084613af3565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b73ffffffffffffffffffffffffffffffffffffffff8116612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b48565b61216e81612f77565b50565b6002600154036121dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b48565b600260015560005473ffffffffffffffffffffffffffffffffffffffff163314612263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b48565b73ffffffffffffffffffffffffffffffffffffffff81166122b0576040517fddc87b6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600d5460ff1660028111156122c9576122c96139d3565b14612300576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561236f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123939190613b9a565b6007546040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810183905291925073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561240057600080fd5b505af1158015612414573d6000803e3d6000fd5b50505050610d2e8282612e1d565b73ffffffffffffffffffffffffffffffffffffffff83166124c4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff8216612567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526126a99084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261304a565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600360209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461277f5781811015612772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610b48565b61277f8484848403612422565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316612828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff82166128cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602052604090205481811015612981576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260205260408082208585039055918516815290812080548492906129c5908490613b6b565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612a2b91815260200190565b60405180910390a361277f565b6000805b600c54811015612b0f576000600c8281548110612a5b57612a5b613c0d565b6000918252602090912001546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152909116906370a0823190602401602060405180830381865afa158015612ad4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af89190613b9a565b11612b0f5780612b0781613c3c565b915050612a3c565b600c541192915050565b6000600d5460ff166002811115612b3257612b326139d3565b14612b69576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b7281612a38565b612ba8576040517f7a1018f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a54600454612bb89086613b6b565b1115612bf0576040517f1e186f7200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8115612c1b57600754612c1b9073ffffffffffffffffffffffffffffffffffffffff16333086612fec565b612c258185613156565b600954600854612c359086613af3565b612c3f9190613b30565b600b6000828254612c509190613b6b565b9091555050604080518481526020810186905273ffffffffffffffffffffffffffffffffffffffff83169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff8216612cfb576040517fddc87b6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600d5460ff166002811115612d1457612d146139d3565b14612d4b576040517f781057a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81163314612d7357612d738133876126ae565b612d7d8186613276565b83600b6000828254612d8f9190613b83565b90915550508215612dbe57600754612dbe9073ffffffffffffffffffffffffffffffffffffffff1683866125d5565b604080518581526020810187905273ffffffffffffffffffffffffffffffffffffffff808416929085169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a45050505050565b80471015612e87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b48565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114612ee1576040519150601f19603f3d011682016040523d82523d6000602084013e612ee6565b606091505b50509050806126a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b48565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261277f9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401612627565b60006130ac826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134639092919063ffffffff16565b8051909150156126a957808060200190518101906130ca9190613c74565b6126a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff82166131d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610b48565b80600460008282546131e59190613b6b565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000908152600260205260408120805483929061321f908490613b6b565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216613319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054818110156133cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812083830390556004805484929061340b908490613b83565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6060613472848460008561347a565b949350505050565b60608247101561350c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b48565b73ffffffffffffffffffffffffffffffffffffffff85163b61358a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b48565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135b39190613c96565b60006040518083038185875af1925050503d80600081146135f0576040519150601f19603f3d011682016040523d82523d6000602084013e6135f5565b606091505b5091509150613605828286613610565b979650505050505050565b6060831561361f5750816110a5565b82511561362f5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b489190613747565b8280548282559060005260206000209081019282156136dd579160200282015b828111156136dd57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190613683565b506136e99291506136ed565b5090565b5b808211156136e957600081556001016136ee565b60006020828403121561371457600080fd5b5035919050565b60005b8381101561373657818101518382015260200161371e565b8381111561277f5750506000910152565b602081526000825180602084015261376681604085016020870161371b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461216e57600080fd5b8035610a4381613798565b600080604083850312156137d857600080fd5b82356137e381613798565b946020939093013593505050565b60006020828403121561380357600080fd5b81356110a581613798565b60008060006060848603121561382357600080fd5b833561382e81613798565b9250602084013561383e81613798565b929592945050506040919091013590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602080838503121561389157600080fd5b823567ffffffffffffffff808211156138a957600080fd5b818501915085601f8301126138bd57600080fd5b8135818111156138cf576138cf61384f565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156139125761391261384f565b60405291825284820192508381018501918883111561393057600080fd5b938501935b8285101561395557613946856137ba565b84529385019392850192613935565b98975050505050505050565b6000806040838503121561397457600080fd5b82359150602083013561398681613798565b809150509250929050565b6000806000606084860312156139a657600080fd5b8335925060208401356139b881613798565b915060408401356139c881613798565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310613a3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b60008060408385031215613a5657600080fd5b8235613a6181613798565b9150602083013561398681613798565b600181811c90821680613a8557607f821691505b602082108103613abe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b2b57613b2b613ac4565b500290565b600082613b66577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115613b7e57613b7e613ac4565b500190565b600082821015613b9557613b95613ac4565b500390565b600060208284031215613bac57600080fd5b5051919050565b6020808252825182820181905260009190848201906040850190845b81811015613c0157835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613bcf565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c6d57613c6d613ac4565b5060010190565b600060208284031215613c8657600080fd5b815180151581146110a557600080fd5b60008251613ca881846020870161371b565b919091019291505056fea2646970667358221220278cee26ccc30daa8bb6f55d31d0a0cdc7ea4a072c0cdc957bd0425b820468c264736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000021e19e0c9bab2400000000000000000000000000000000000000000000000000000000000000000000c4f6f6c6f6e6720746f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034f4c540000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): Oolong token
Arg [1] : _symbol (string): OLT
Arg [2] : _weth9 (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : _initialPrice (uint256): 100
Arg [4] : _priceDenominator (uint256): 10000
Arg [5] : _maxSupply (uint256): 10000000000000000000000
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [4] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [5] : 00000000000000000000000000000000000000000000021e19e0c9bab2400000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [7] : 4f6f6c6f6e6720746f6b656e0000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [9] : 4f4c540000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
58027:5295:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58626:10;;;;58612;:24;58608:54;;58645:17;;;;;;;;;;;;;;58608:54;58027:5295;;;;;48028:121;;;;;;;;;;-1:-1:-1;48129:12:0;;48028:121;;;160:25:1;;;148:2;133:18;48028:121:0;;;;;;;;44132:27;;;;;;;;;;-1:-1:-1;44132:27:0;;;;;:::i;:::-;;:::i;:::-;;;557:42:1;545:55;;;527:74;;515:2;500:18;44132:27:0;381:226:1;17326:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;48805:350::-;;;;;;;;;;-1:-1:-1;48805:350:0;;;;;:::i;:::-;;:::i;19677:201::-;;;;;;;;;;-1:-1:-1;19677:201:0;;;;;:::i;:::-;;:::i;:::-;;;2105:14:1;;2098:22;2080:41;;2068:2;2053:18;19677:201:0;1940:187:1;52883:249:0;;;;;;;;;;-1:-1:-1;52883:249:0;;;;;:::i;:::-;;:::i;46008:477::-;;;;;;;;;;-1:-1:-1;46008:477:0;;;;;:::i;:::-;;:::i;59719:628::-;;;;;;:::i;:::-;;:::i;18446:108::-;;;;;;;;;;-1:-1:-1;18534:12:0;;18446:108;;43991:27;;;;;;;;;;;;;;;;20458:295;;;;;;;;;;-1:-1:-1;20458:295:0;;;;;:::i;:::-;;:::i;18288:93::-;;;;;;;;;;-1:-1:-1;18288:93:0;;18371:2;2987:36:1;;2975:2;2960:18;18288:93:0;2845:184:1;47832:112:0;;;;;;;;;;-1:-1:-1;47926:10:0;;;;47832:112;;21162:238;;;;;;;;;;-1:-1:-1;21162:238:0;;;;;:::i;:::-;;:::i;49362:387::-;;;;;;;;;;-1:-1:-1;49362:387:0;;;;;:::i;:::-;;:::i;45639:151::-;;;;;;;;;;-1:-1:-1;45639:151:0;;;;;:::i;:::-;;:::i;54422:228::-;;;;;;;;;;-1:-1:-1;54422:228:0;;;;;:::i;:::-;;:::i;60609:338::-;;;;;;:::i;:::-;;:::i;62166:379::-;;;;;;;;;;-1:-1:-1;62166:379:0;;;;;:::i;:::-;;:::i;62963:356::-;;;;;;;;;;-1:-1:-1;62963:356:0;;;;;:::i;:::-;;:::i;50475:218::-;;;;;;;;;;-1:-1:-1;50475:218:0;;;;;:::i;:::-;;:::i;18617:127::-;;;;;;;;;;-1:-1:-1;18617:127:0;;;;;:::i;:::-;18718:18;;18691:7;18718:18;;;:9;:18;;;;;;;18617:127;29834:103;;;;;;;;;;;;;:::i;29183:87::-;;;;;;;;;;-1:-1:-1;29229:7:0;29256:6;;;29183:87;;51994:212;;;;;;;;;;-1:-1:-1;51994:212:0;;;;;:::i;:::-;;:::i;17545:104::-;;;;;;;;;;;;;:::i;21903:436::-;;;;;;;;;;-1:-1:-1;21903:436:0;;;;;:::i;:::-;;:::i;18950:193::-;;;;;;;;;;-1:-1:-1;18950:193:0;;;;;:::i;:::-;;:::i;51465:270::-;;;;;;;;;;-1:-1:-1;51465:270:0;;;;;:::i;:::-;;:::i;53541:246::-;;;;;;;;;;-1:-1:-1;53541:246:0;;;;;:::i;:::-;;:::i;55060:242::-;;;;;;;;;;-1:-1:-1;55060:242:0;;;;;:::i;:::-;;:::i;44166:27::-;;;;;;;;;;-1:-1:-1;44166:27:0;;;;;;;;;;;;;;;:::i;47508:254::-;;;;;;;;;;-1:-1:-1;47508:254:0;;;;;:::i;:::-;;:::i;50905:348::-;;;;;;;;;;-1:-1:-1;50905:348:0;;;;;:::i;:::-;;:::i;48303:::-;;;;;;;;;;-1:-1:-1;48303:348:0;;;;;:::i;:::-;;:::i;44025:31::-;;;;;;;;;;;;;;;;52425:245;;;;;;;;;;-1:-1:-1;52425:245:0;;;;;:::i;:::-;;:::i;61214:535::-;;;;;;:::i;:::-;;:::i;44063:24::-;;;;;;;;;;;;;;;;53996:212;;;;;;;;;;-1:-1:-1;53996:212:0;;;;;:::i;:::-;;:::i;19206:151::-;;;;;;;;;;-1:-1:-1;19206:151:0;;;;;:::i;:::-;19322:18;;;;19295:7;19322:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19206:151;46756:564;;;;;;;;;;-1:-1:-1;46756:564:0;;;;;:::i;:::-;;:::i;49961:255::-;;;;;;;;;;-1:-1:-1;49961:255:0;;;;;:::i;:::-;;:::i;30092:201::-;;;;;;;;;;-1:-1:-1;30092:201:0;;;;;:::i;:::-;;:::i;58917:521::-;;;;;;;;;;-1:-1:-1;58917:521:0;;;;;:::i;:::-;;:::i;44132:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44132:27:0;:::o;17326:100::-;17380:13;17413:5;17406:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17326:100;:::o;48805:350::-;48879:14;48910:13;18534:12;;;18446:108;48910:13;48927:1;48910:18;48906:242;;49031:16;;49016:12;;49006:22;;:7;:22;:::i;:::-;:41;;;;:::i;:::-;48999:48;48805:350;-1:-1:-1;;48805:350:0:o;48906:242::-;18534:12;;49112:7;49097:12;;:22;;;;:::i;48906:242::-;48805:350;;;:::o;19677:201::-;19760:4;15046:10;19816:32;15046:10;19832:7;19841:6;19816:8;:32::i;:::-;-1:-1:-1;19866:4:0;;19677:201;-1:-1:-1;;;19677:201:0:o;52883:249::-;52955:14;52999:17;52986:9;;;;:30;;;;;;;;:::i;:::-;;52982:63;;53025:20;;;;;;;;;;;;;;52982:63;53112:12;;53107:1;53112:12;53082:7;53066:13;18534:12;;;18446:108;53066:13;:23;;;;:::i;:::-;:38;;;;:::i;:::-;:42;;;;:::i;46008:477::-;13340:1;13938:7;;:19;13930:63;;;;;;;8513:2:1;13930:63:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:33;8571:18;;;8564:61;8642:18;;13930:63:0;;;;;;;;;13340:1;14071:7;:18;29229:7;29256:6;29403:23:::1;29256:6:::0;15046:10;29403:23:::1;29395:68;;;::::0;::::1;::::0;;8873:2:1;29395:68:0::1;::::0;::::1;8855:21:1::0;;;8892:18;;;8885:30;8951:34;8931:18;;;8924:62;9003:18;;29395:68:0::1;8671:356:1::0;29395:68:0::1;46101:23:::2;::::0;::::2;46097:62;;46133:26;;;;;;;;;;;;;;46097:62;46187:18;46174:9;::::0;::::2;;:31;::::0;::::2;;;;;;:::i;:::-;;46170:64;;46214:20;;;;;;;;;;;;;;46170:64;46272:10;::::0;46265:43:::2;::::0;;;;46302:4:::2;46265:43;::::0;::::2;527:74:1::0;46247:15:0::2;::::0;46272:10:::2;;::::0;46265:28:::2;::::0;500:18:1;;46265:43:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46326:10;::::0;46247:61;;-1:-1:-1;46319:51:0::2;::::0;46326:10:::2;;46351:9:::0;46247:61;46319:31:::2;:51::i;:::-;46381:9;:30:::0;;;::::2;46393:18;46381:30;::::0;;46464:12:::2;::::0;46429:48:::2;::::0;160:25:1;;;46429:48:0::2;::::0;::::2;::::0;46441:10:::2;::::0;46429:48:::2;::::0;148:2:1;133:18;46429:48:0::2;;;;;;;-1:-1:-1::0;;13296:1:0;14250:22;;46008:477::o;59719:628::-;13340:1;13938:7;;:19;13930:63;;;;;;;8513:2:1;13930:63:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:33;8571:18;;;8564:61;8642:18;;13930:63:0;8311:355:1;13930:63:0;13340:1;14071:7;:18;29229:7;29256:6;29403:23:::1;29256:6:::0;15046:10;29403:23:::1;29395:68;;;::::0;::::1;::::0;;8873:2:1;29395:68:0::1;::::0;::::1;8855:21:1::0;;;8892:18;;;8885:30;8951:34;8931:18;;;8924:62;9003:18;;29395:68:0::1;8671:356:1::0;29395:68:0::1;59841:17:::2;59828:9;::::0;::::2;;:30;::::0;::::2;;;;;;:::i;:::-;::::0;59824:63:::2;;59867:20;;;;;;;;;;;;;;59824:63;59917:18;59904:9;::::0;::::2;;:31;::::0;::::2;;;;;;:::i;:::-;::::0;59900:340:::2;;59969:15;59956:9;:28;59952:55;;59993:14;;;;;;;;;;;;;;59952:55;60029:10;;;;;;;;;;;60022:26;;;60057:9;60022:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;60085:12:0::2;:30:::0;;;-1:-1:-1;59900:340:0::2;::::0;-1:-1:-1;59900:340:0::2;;60161:20:::0;;::::2;::::0;:38:::2;;-1:-1:-1::0;60185:9:0::2;:14:::0;::::2;60161:38;60157:71;;;60208:20;;;;;;;;;;;;;;60157:71;60256:9;:29:::0;;;::::2;60268:17;60256:29;::::0;;60326:12:::2;::::0;60303:36:::2;::::0;160:25:1;;;60314:10:0::2;::::0;60303:36:::2;::::0;148:2:1;133:18;60303:36:0::2;;;;;;;-1:-1:-1::0;13296:1:0;14250:22;;59719:628::o;20458:295::-;20589:4;15046:10;20647:38;20663:4;15046:10;20678:6;20647:15;:38::i;:::-;20696:27;20706:4;20712:2;20716:6;20696:9;:27::i;:::-;20741:4;20734:11;;;20458:295;;;;;;:::o;21162:238::-;15046:10;21250:4;19322:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;21250:4;;15046:10;21306:64;;15046:10;;19322:27;;21331:38;;21359:10;;21331:38;:::i;:::-;21306:8;:64::i;49362:387::-;49433:17;;49467:9;;;;:31;;;;;;;;:::i;:::-;;49463:72;;-1:-1:-1;49522:1:0;;49362:387;-1:-1:-1;49362:387:0:o;49463:72::-;49552:18;49560:9;49552:7;:18::i;:::-;49547:114;;-1:-1:-1;49648:1:0;;49362:387;-1:-1:-1;49362:387:0:o;49547:114::-;49725:16;;49710:12;;18534;;49681:9;;:25;;;;:::i;:::-;49680:42;;;;:::i;45639:151::-;29229:7;29256:6;29403:23;29256:6;15046:10;29403:23;29395:68;;;;;;;8873:2:1;29395:68:0;;;8855:21:1;;;8892:18;;;8885:30;8951:34;8931:18;;;8924:62;9003:18;;29395:68:0;8671:356:1;29395:68:0;45717:18;;::::1;::::0;:10:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;45764:10;45753:29;;;45776:5;45753:29;;;;;;:::i;:::-;;;;;;;;45639:151:::0;:::o;54422:228::-;54492:14;54536:17;54523:9;;;;:30;;;;;;;;:::i;:::-;;54519:63;;54562:20;;;;;;;;;;;;;;60609:338;60704:14;13340:1;13938:7;;:19;13930:63;;;;;;;8513:2:1;13930:63:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:33;8571:18;;;8564:61;8642:18;;13930:63:0;8311:355:1;13930:63:0;13340:1;14071:7;:18;60735:9:::1;:20:::0;::::1;60731:47;;60764:14;;;;;;;;;;;;;;60731:47;60796:10;;;;;;;;;;;60789:26;;;60824:9;60789:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;60857:23;60872:7;60857:14;:23::i;:::-;60848:32;;60891:48;60905:6;60913:7;60922:5;60929:9;60891:13;:48::i;:::-;13296:1:::0;14250:22;;60609:338;;-1:-1:-1;;60609:338:0:o;62166:379::-;62278:14;13340:1;13938:7;;:19;13930:63;;;;;;;8513:2:1;13930:63:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:33;8571:18;;;8564:61;8642:18;;13930:63:0;8311:355:1;13930:63:0;13340:1;14071:7;:18;;;62361:12:::1;::::0;;;62331:7;62315:13:::1;18534:12:::0;;;18446:108;62315:13:::1;:23;;;;:::i;:::-;:38;;;;:::i;:::-;:42;;;;:::i;:::-;62314:59;;;;:::i;:::-;62305:68;;62384:58;62400:6;62408:7;62417:5;62424:9;62435:6;62384:15;:58::i;:::-;62460:10;::::0;62453:36:::1;::::0;;;;::::1;::::0;::::1;160:25:1::0;;;62460:10:0::1;::::0;;::::1;::::0;62453:27:::1;::::0;133:18:1;;62453:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;62500:37;62518:9;62529:7;62500:17;:37::i;:::-;13296:1:::0;14250:22;;62166:379;;-1:-1:-1;;;62166:379:0:o;62963:356::-;63073:14;13340:1;13938:7;;:19;13930:63;;;;;;;8513:2:1;13930:63:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:33;8571:18;;;8564:61;8642:18;;13930:63:0;8311:355:1;13930:63:0;13340:1;14071:7;:18;18534:12;;63125:7:::1;63110:12;;:22;;;;:::i;:::-;63109:40;;;;:::i;:::-;63100:49;;63160:58;63176:7;63185:6;63193:5;63200:9;63211:6;63160:15;:58::i;:::-;63236:10;::::0;63229:35:::1;::::0;;;;::::1;::::0;::::1;160:25:1::0;;;63236:10:0::1;::::0;;::::1;::::0;63229:27:::1;::::0;133:18:1;;63229:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63275:36;63293:9;63304:6;63275:17;:36::i;50475:218::-:0;50568:14;13340:1;13938:7;;:19;13930:63;;;;;;;8513:2:1;13930:63:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:33;8571:18;;;8564:61;8642:18;;13930:63:0;8311:355:1;13930:63:0;13340:1;14071:7;:18;50604:23:::1;50619:7:::0;50604:14:::1;:23::i;:::-;50595:32;;50638:47;50652:6;50660:7;50669:4;50675:9;50638:13;:47::i;29834:103::-:0;29229:7;29256:6;29403:23;29256:6;15046:10;29403:23;29395:68;;;;;;;8873:2:1;29395:68:0;;;8855:21:1;;;8892:18;;;8885:30;8951:34;8931:18;;;8924:62;9003:18;;29395:68:0;8671:356:1;29395:68:0;29899:30:::1;29926:1;29899:18;:30::i;:::-;29834:103::o:0;51994:212::-;52084:14;13340:1;13938:7;;:19;13930:63;;;;;;;8513:2:1;13930:63:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:33;8571:18;;;8564:61;8642:18;;13930:63:0;8311:355:1;13930:63:0;13340:1;14071:7;:18;52120:20:::1;52132:7:::0;52120:11:::1;:20::i;:::-;52111:29;;52151:47;52165:7;52174:6;52182:4;52188:9;52151:13;:47::i;17545:104::-:0;17601:13;17634:7;17627:14;;;;;:::i;21903:436::-;15046:10;21996:4;19322:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;21996:4;;15046:10;22143:15;22123:16;:35;;22115:85;;;;;;;10109:2:1;22115:85:0;;;10091:21:1;10148:2;10128:18;;;10121:30;10187:34;10167:18;;;10160:62;10258:7;10238:18;;;10231:35;10283:19;;22115:85:0;9907:401:1;22115:85:0;22236:60;22245:5;22252:7;22280:15;22261:16;:34;22236:8;:60::i;:::-;-1:-1:-1;22327:4:0;;21903:436;-1:-1:-1;;;;21903:436:0:o;18950:193::-;19029:4;15046:10;19085:28;15046:10;19102:2;19106:6;19085:9;:28::i;51465:270::-;51533:14;;51564:9;;;;:31;;;;;;;;:::i;:::-;;51560:64;;51604:20;;;;;;;;;;;;;;51560:64;51694:16;;51689:1;51670:16;;51655:12;;51645:7;:22;;;;:::i;53541:246::-;53651:14;13340:1;13938:7;;:19;13930:63;;;;;;;8513:2:1;13930:63:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:33;8571:18;;;8564:61;8642:18;;13930:63:0;8311:355:1;13930:63:0;13340:1;14071:7;:18;53687:24:::1;53703:7:::0;53687:15:::1;:24::i;:::-;53678:33;;53722:57;53738:6;53746:7;53755:4;53761:9;53772:6;53722:15;:57::i;55060:242::-:0;55168:14;13340:1;13938:7;;:19;13930:63;;;;;;;8513:2:1;13930:63:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:33;8571:18;;;8564:61;8642:18;;13930:63:0;8311:355:1;13930:63:0;13340:1;14071:7;:18;55204:22:::1;55218:7:::0;55204:13:::1;:22::i;:::-;55195:31;;55237:57;55253:7;55262:6;55270:4;55276:9;55287:6;55237:15;:57::i;47508:254::-:0;29229:7;29256:6;29403:23;29256:6;15046:10;29403:23;29395:68;;;;;;;8873:2:1;29395:68:0;;;8855:21:1;;;8892:18;;;8885:30;8951:34;8931:18;;;8924:62;9003:18;;29395:68:0;8671:356:1;29395:68:0;47606:18:::1;47593:9;::::0;::::1;;:31;::::0;::::1;;;;;;:::i;:::-;;47589:64;;47633:20;;;;;;;;;;;;;;47589:64;47666:12;:28:::0;;;47712:42:::1;::::0;160:25:1;;;47729:10:0::1;::::0;47712:42:::1;::::0;148:2:1;133:18;47712:42:0::1;14:177:1::0;50905:348:0;50973:17;;51007:9;;;;:31;;;;;;;;:::i;:::-;;51003:72;;-1:-1:-1;51062:1:0;;50905:348;-1:-1:-1;50905:348:0:o;51003:72::-;51092:18;51100:9;51092:7;:18::i;:::-;51087:114;;-1:-1:-1;51188:1:0;;50905:348;-1:-1:-1;50905:348:0:o;51087:114::-;18534:12;;51220:9;;:25;;;;:::i;48303:348::-;48377:14;48408:13;18534:12;;;18446:108;48408:13;48425:1;48408:18;48404:240;;48533:12;;48514:16;;48504:26;;:7;:26;:::i;48404:240::-;48620:12;;48610:7;48594:13;18534:12;;;18446:108;52425:245;52494:17;52541;52528:9;;;;:30;;;;;;;;:::i;:::-;;52524:71;;-1:-1:-1;52582:1:0;;52425:245;-1:-1:-1;52425:245:0:o;52524:71::-;18534:12;;52634;;18718:18;;;18691:7;18718:18;;;:9;:18;;;;;;52614:17;18617:127;61214:535;61306:14;13340:1;13938:7;;:19;13930:63;;;;;;;8513:2:1;13930:63:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:33;8571:18;;;8564:61;8642:18;;13930:63:0;8311:355:1;13930:63:0;13340:1;14071:7;:18;61342:20:::1;61354:7:::0;61342:11:::1;:20::i;:::-;61333:29;;61389:6;61377:9;:18;61373:45;;;61404:14;;;;;;;;;;;;;;61373:45;61429:14;61446:18;61458:6:::0;61446:9:::1;:18;:::i;:::-;61429:35:::0;-1:-1:-1;61479:10:0;;61475:143:::1;;61560:46;61586:10;61599:6;61560:17;:46::i;:::-;61637:10;;;;;;;;;;;61630:26;;;61665:6;61630:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;61693:48;61707:7;61716:6;61724:5;61731:9;61693:13;:48::i;:::-;-1:-1:-1::0;13296:1:0;14250:22;;61214:535;;-1:-1:-1;;61214:535:0:o;53996:212::-;54063:17;54110;54097:9;;;;:30;;;;;;;;:::i;:::-;;54093:71;;-1:-1:-1;54151:1:0;;53996:212;-1:-1:-1;53996:212:0:o;54093:71::-;18718:18;;;18691:7;18718:18;;;:9;:18;;;;;;54183:17;18617:127;46756:564;13340:1;13938:7;;:19;13930:63;;;;;;;8513:2:1;13930:63:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:33;8571:18;;;8564:61;8642:18;;13930:63:0;8311:355:1;13930:63:0;13340:1;14071:7;:18;29229:7;29256:6;29403:23:::1;29256:6:::0;15046:10;29403:23:::1;29395:68;;;::::0;::::1;::::0;;8873:2:1;29395:68:0::1;::::0;::::1;8855:21:1::0;;;8892:18;;;8885:30;8951:34;8931:18;;;8924:62;9003:18;;29395:68:0::1;8671:356:1::0;29395:68:0::1;46867:17:::2;46854:9;::::0;::::2;;:30;::::0;::::2;;;;;;:::i;:::-;::::0;46850:63:::2;;46893:20;;;;;;;;;;;;;;46850:63;46951:18;46938:9;::::0;::::2;;:31;::::0;::::2;;;;;;:::i;:::-;::::0;46934:283:::2;;46993:10;::::0;46986:79:::2;::::0;46993:10:::2;;47022;47042:4;47049:15:::0;46986:35:::2;:79::i;:::-;47080:12;:30:::0;;;46934:283:::2;;;47156:20:::0;;47152:53:::2;;47185:20;;;;;;;;;;;;;;49961:255:::0;50032:14;;50063:9;;;;:31;;;;;;;;:::i;:::-;;50059:64;;50103:20;;;;;;;;;;;;;;50059:64;50172:12;;50153:16;;50143:26;;:7;:26;:::i;30092:201::-;29229:7;29256:6;29403:23;29256:6;15046:10;29403:23;29395:68;;;;;;;8873:2:1;29395:68:0;;;8855:21:1;;;8892:18;;;8885:30;8951:34;8931:18;;;8924:62;9003:18;;29395:68:0;8671:356:1;29395:68:0;30181:22:::1;::::0;::::1;30173:73;;;::::0;::::1;::::0;;10515:2:1;30173:73:0::1;::::0;::::1;10497:21:1::0;10554:2;10534:18;;;10527:30;10593:34;10573:18;;;10566:62;10664:8;10644:18;;;10637:36;10690:19;;30173:73:0::1;10313:402:1::0;30173:73:0::1;30257:28;30276:8;30257:18;:28::i;:::-;30092:201:::0;:::o;58917:521::-;13340:1;13938:7;;:19;13930:63;;;;;;;8513:2:1;13930:63:0;;;8495:21:1;8552:2;8532:18;;;8525:30;8591:33;8571:18;;;8564:61;8642:18;;13930:63:0;8311:355:1;13930:63:0;13340:1;14071:7;:18;29229:7;29256:6;29403:23:::1;29256:6:::0;15046:10;29403:23:::1;29395:68;;;::::0;::::1;::::0;;8873:2:1;29395:68:0::1;::::0;::::1;8855:21:1::0;;;8892:18;;;8885:30;8951:34;8931:18;;;8924:62;9003:18;;29395:68:0::1;8671:356:1::0;29395:68:0::1;59021:23:::2;::::0;::::2;59017:62;;59053:26;;;;;;;;;;;;;;59017:62;59107:18;59094:9;::::0;::::2;;:31;::::0;::::2;;;;;;:::i;:::-;;59090:64;;59134:20;;;;;;;;;;;;;;59090:64;59192:10;::::0;59185:43:::2;::::0;;;;59222:4:::2;59185:43;::::0;::::2;527:74:1::0;59167:15:0::2;::::0;59192:10:::2;;::::0;59185:28:::2;::::0;500:18:1;;59185:43:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59246:10;::::0;59239:36:::2;::::0;;;;::::2;::::0;::::2;160:25:1::0;;;59167:61:0;;-1:-1:-1;59246:10:0::2;;::::0;59239:27:::2;::::0;133:18:1;;59239:36:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;59286:37;59304:9;59315:7;59286:17;:37::i;25537:380::-:0;25673:19;;;25665:68;;;;;;;10922:2:1;25665:68:0;;;10904:21:1;10961:2;10941:18;;;10934:30;11000:34;10980:18;;;10973:62;11071:6;11051:18;;;11044:34;11095:19;;25665:68:0;10720:400:1;25665:68:0;25752:21;;;25744:68;;;;;;;11327:2:1;25744:68:0;;;11309:21:1;11366:2;11346:18;;;11339:30;11405:34;11385:18;;;11378:62;11476:4;11456:18;;;11449:32;11498:19;;25744:68:0;11125:398:1;25744:68:0;25825:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25877:32;;160:25:1;;;25877:32:0;;133:18:1;25877:32:0;;;;;;;25537:380;;;:::o;39851:211::-;39995:58;;11732:42:1;11720:55;;39995:58:0;;;11702:74:1;11792:18;;;11785:34;;;39968:86:0;;39988:5;;40018:23;;11675:18:1;;39995:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39968:19;:86::i;:::-;39851:211;;;:::o;26208:453::-;19322:18;;;;26343:24;19322:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;26430:17;26410:37;;26406:248;;26492:6;26472:16;:26;;26464:68;;;;;;;12032:2:1;26464:68:0;;;12014:21:1;12071:2;12051:18;;;12044:30;12110:31;12090:18;;;12083:59;12159:18;;26464:68:0;11830:353:1;26464:68:0;26576:51;26585:5;26592:7;26620:6;26601:16;:25;26576:8;:51::i;:::-;26332:329;26208:453;;;:::o;22818:671::-;22949:18;;;22941:68;;;;;;;12390:2:1;22941:68:0;;;12372:21:1;12429:2;12409:18;;;12402:30;12468:34;12448:18;;;12441:62;12539:7;12519:18;;;12512:35;12564:19;;22941:68:0;12188:401:1;22941:68:0;23028:16;;;23020:64;;;;;;;12796:2:1;23020:64:0;;;12778:21:1;12835:2;12815:18;;;12808:30;12874:34;12854:18;;;12847:62;12945:5;12925:18;;;12918:33;12968:19;;23020:64:0;12594:399:1;23020:64:0;23170:15;;;23148:19;23170:15;;;:9;:15;;;;;;23204:21;;;;23196:72;;;;;;;13200:2:1;23196:72:0;;;13182:21:1;13239:2;13219:18;;;13212:30;13278:34;13258:18;;;13251:62;13349:8;13329:18;;;13322:36;13375:19;;23196:72:0;12998:402:1;23196:72:0;23304:15;;;;;;;;:9;:15;;;;;;23322:20;;;23304:38;;23364:13;;;;;;;;:23;;23336:6;;23304:15;23364:23;;23336:6;;23364:23;:::i;:::-;;;;;;;;23420:2;23405:26;;23414:4;23405:26;;;23424:6;23405:26;;;;160:25:1;;148:2;133:18;;14:177;23405:26:0;;;;;;;;23444:37;39851:211;57368:310;57427:11;;57471:159;57487:10;:17;57483:21;;57471:159;;;57576:1;57538:10;57549:1;57538:13;;;;;;;;:::i;:::-;;;;;;;;;;;57530:43;;;;;57538:13;545:55:1;;;57530:43:0;;;527:74:1;57538:13:0;;;;57530:32;;500:18:1;;57530:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;57598:5;57526:93;57506:3;;;;:::i;:::-;;;;57471:159;;;57653:10;:17;-1:-1:-1;57649:21:0;57368:310;-1:-1:-1;;57368:310:0:o;55589:622::-;55718:18;55705:9;;;;:31;;;;;;;;:::i;:::-;;55701:64;;55745:20;;;;;;;;;;;;;;55701:64;55781:18;55789:9;55781:7;:18::i;:::-;55776:53;;55808:21;;;;;;;;;;;;;;55776:53;55870:9;;18534:12;;55844:23;;:7;:23;:::i;:::-;:35;55840:65;;;55888:17;;;;;;;;;;;;;;55840:65;55922:9;55918:116;;;55955:10;;55948:71;;55955:10;;55984;56004:4;56011:7;55948:35;:71::i;:::-;56046:25;56052:9;56063:7;56046:5;:25::i;:::-;56123:16;;56108:12;;56098:22;;:7;:22;:::i;:::-;:41;;;;:::i;:::-;56082:12;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;56155:48:0;;;13968:25:1;;;14024:2;14009:18;;14002:34;;;56155:48:0;;;;56163:10;;56155:48;;13941:18:1;56155:48:0;;;;;;;55589:622;;;;:::o;56552:633::-;56686:23;;;56682:62;;56718:26;;;;;;;;;;;;;;56682:62;56772:17;56759:9;;;;:30;;;;;;;;:::i;:::-;;56755:63;;56798:20;;;;;;;;;;;;;;56755:63;56833:20;;;56843:10;56833:20;56829:97;;56870:44;56886:6;56894:10;56906:7;56870:15;:44::i;:::-;56938:22;56944:6;56952:7;56938:5;:22::i;:::-;56987:7;56971:12;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;57007:96:0;;;;57044:10;;57037:51;;57044:10;;57069:9;57080:7;57037:31;:51::i;:::-;57120:57;;;13968:25:1;;;14024:2;14009:18;;14002:34;;;57120:57:0;;;;;;;;;57129:10;;57120:57;;13941:18:1;57120:57:0;;;;;;;56552:633;;;;;:::o;33145:317::-;33260:6;33235:21;:31;;33227:73;;;;;;;14249:2:1;33227:73:0;;;14231:21:1;14288:2;14268:18;;;14261:30;14327:31;14307:18;;;14300:59;14376:18;;33227:73:0;14047:353:1;33227:73:0;33314:12;33332:9;:14;;33354:6;33332:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33313:52;;;33384:7;33376:78;;;;;;;14817:2:1;33376:78:0;;;14799:21:1;14856:2;14836:18;;;14829:30;14895:34;14875:18;;;14868:62;14966:28;14946:18;;;14939:56;15012:19;;33376:78:0;14615:422:1;30453:191:0;30527:16;30546:6;;;30563:17;;;;;;;;;;30596:40;;30546:6;;;;;;;30596:40;;30527:16;30596:40;30516:128;30453:191;:::o;40070:248::-;40241:68;;15254:42:1;15323:15;;;40241:68:0;;;15305:34:1;15375:15;;15355:18;;;15348:43;15407:18;;;15400:34;;;40214:96:0;;40234:5;;40264:27;;15217:18:1;;40241:68:0;15042:398:1;42424:716:0;42848:23;42874:69;42902:4;42874:69;;;;;;;;;;;;;;;;;42882:5;42874:27;;;;:69;;;;;:::i;:::-;42958:17;;42848:95;;-1:-1:-1;42958:21:0;42954:179;;43055:10;43044:30;;;;;;;;;;;;:::i;:::-;43036:85;;;;;;;15929:2:1;43036:85:0;;;15911:21:1;15968:2;15948:18;;;15941:30;16007:34;15987:18;;;15980:62;16078:12;16058:18;;;16051:40;16108:19;;43036:85:0;15727:406:1;23776:399:0;23860:21;;;23852:65;;;;;;;16340:2:1;23852:65:0;;;16322:21:1;16379:2;16359:18;;;16352:30;16418:33;16398:18;;;16391:61;16469:18;;23852:65:0;16138:355:1;23852:65:0;24008:6;23992:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;24025:18:0;;;;;;;:9;:18;;;;;:28;;24047:6;;24025:18;:28;;24047:6;;24025:28;:::i;:::-;;;;-1:-1:-1;;24069:37:0;;160:25:1;;;24069:37:0;;;;24086:1;;24069:37;;148:2:1;133:18;24069:37:0;;;;;;;23776:399;;:::o;24508:591::-;24592:21;;;24584:67;;;;;;;16700:2:1;24584:67:0;;;16682:21:1;16739:2;16719:18;;;16712:30;16778:34;16758:18;;;16751:62;16849:3;16829:18;;;16822:31;16870:19;;24584:67:0;16498:397:1;24584:67:0;24751:18;;;24726:22;24751:18;;;:9;:18;;;;;;24788:24;;;;24780:71;;;;;;;17102:2:1;24780:71:0;;;17084:21:1;17141:2;17121:18;;;17114:30;17180:34;17160:18;;;17153:62;17251:4;17231:18;;;17224:32;17273:19;;24780:71:0;16900:398:1;24780:71:0;24887:18;;;;;;;:9;:18;;;;;24908:23;;;24887:44;;24953:12;:22;;24925:6;;24887:18;24953:22;;24925:6;;24953:22;:::i;:::-;;;;-1:-1:-1;;24993:37:0;;160:25:1;;;25019:1:0;;24993:37;;;;;;148:2:1;133:18;24993:37:0;;;;;;;39851:211;;;:::o;34629:229::-;34766:12;34798:52;34820:6;34828:4;34834:1;34837:12;34798:21;:52::i;:::-;34791:59;34629:229;-1:-1:-1;;;;34629:229:0:o;35749:510::-;35919:12;35977:5;35952:21;:30;;35944:81;;;;;;;17505:2:1;35944:81:0;;;17487:21:1;17544:2;17524:18;;;17517:30;17583:34;17563:18;;;17556:62;17654:8;17634:18;;;17627:36;17680:19;;35944:81:0;17303:402:1;35944:81:0;32179:19;;;;36036:60;;;;;;;17912:2:1;36036:60:0;;;17894:21:1;17951:2;17931:18;;;17924:30;17990:31;17970:18;;;17963:59;18039:18;;36036:60:0;17710:353:1;36036:60:0;36110:12;36124:23;36151:6;:11;;36170:5;36177:4;36151:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36109:73;;;;36200:51;36217:7;36226:10;36238:12;36200:16;:51::i;:::-;36193:58;35749:510;-1:-1:-1;;;;;;;35749:510:0:o;38435:712::-;38585:12;38614:7;38610:530;;;-1:-1:-1;38645:10:0;38638:17;;38610:530;38759:17;;:21;38755:374;;38957:10;38951:17;39018:15;39005:10;39001:2;38997:19;38990:44;38755:374;39100:12;39093:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:180:1;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:1;;196:180;-1:-1:-1;196:180:1:o;612:258::-;684:1;694:113;708:6;705:1;702:13;694:113;;;784:11;;;778:18;765:11;;;758:39;730:2;723:10;694:113;;;825:6;822:1;819:13;816:48;;;-1:-1:-1;;860:1:1;842:16;;835:27;612:258::o;875:442::-;1024:2;1013:9;1006:21;987:4;1056:6;1050:13;1099:6;1094:2;1083:9;1079:18;1072:34;1115:66;1174:6;1169:2;1158:9;1154:18;1149:2;1141:6;1137:15;1115:66;:::i;:::-;1233:2;1221:15;1238:66;1217:88;1202:104;;;;1308:2;1198:113;;875:442;-1:-1:-1;;875:442:1:o;1322:154::-;1408:42;1401:5;1397:54;1390:5;1387:65;1377:93;;1466:1;1463;1456:12;1481:134;1549:20;;1578:31;1549:20;1578:31;:::i;1620:315::-;1688:6;1696;1749:2;1737:9;1728:7;1724:23;1720:32;1717:52;;;1765:1;1762;1755:12;1717:52;1804:9;1791:23;1823:31;1848:5;1823:31;:::i;:::-;1873:5;1925:2;1910:18;;;;1897:32;;-1:-1:-1;;;1620:315:1:o;2132:247::-;2191:6;2244:2;2232:9;2223:7;2219:23;2215:32;2212:52;;;2260:1;2257;2250:12;2212:52;2299:9;2286:23;2318:31;2343:5;2318:31;:::i;2384:456::-;2461:6;2469;2477;2530:2;2518:9;2509:7;2505:23;2501:32;2498:52;;;2546:1;2543;2536:12;2498:52;2585:9;2572:23;2604:31;2629:5;2604:31;:::i;:::-;2654:5;-1:-1:-1;2711:2:1;2696:18;;2683:32;2724:33;2683:32;2724:33;:::i;:::-;2384:456;;2776:7;;-1:-1:-1;;;2830:2:1;2815:18;;;;2802:32;;2384:456::o;3034:184::-;3086:77;3083:1;3076:88;3183:4;3180:1;3173:15;3207:4;3204:1;3197:15;3223:1180;3307:6;3338:2;3381;3369:9;3360:7;3356:23;3352:32;3349:52;;;3397:1;3394;3387:12;3349:52;3437:9;3424:23;3466:18;3507:2;3499:6;3496:14;3493:34;;;3523:1;3520;3513:12;3493:34;3561:6;3550:9;3546:22;3536:32;;3606:7;3599:4;3595:2;3591:13;3587:27;3577:55;;3628:1;3625;3618:12;3577:55;3664:2;3651:16;3686:2;3682;3679:10;3676:36;;;3692:18;;:::i;:::-;3738:2;3735:1;3731:10;3770:2;3764:9;3829:66;3824:2;3820;3816:11;3812:84;3804:6;3800:97;3947:6;3935:10;3932:22;3927:2;3915:10;3912:18;3909:46;3906:72;;;3958:18;;:::i;:::-;3994:2;3987:22;4044:18;;;4078:15;;;;-1:-1:-1;4120:11:1;;;4116:20;;;4148:19;;;4145:39;;;4180:1;4177;4170:12;4145:39;4204:11;;;;4224:148;4240:6;4235:3;4232:15;4224:148;;;4306:23;4325:3;4306:23;:::i;:::-;4294:36;;4257:12;;;;4350;;;;4224:148;;;4391:6;3223:1180;-1:-1:-1;;;;;;;;3223:1180:1:o;4408:315::-;4476:6;4484;4537:2;4525:9;4516:7;4512:23;4508:32;4505:52;;;4553:1;4550;4543:12;4505:52;4589:9;4576:23;4566:33;;4649:2;4638:9;4634:18;4621:32;4662:31;4687:5;4662:31;:::i;:::-;4712:5;4702:15;;;4408:315;;;;;:::o;4728:464::-;4813:6;4821;4829;4882:2;4870:9;4861:7;4857:23;4853:32;4850:52;;;4898:1;4895;4888:12;4850:52;4934:9;4921:23;4911:33;;4994:2;4983:9;4979:18;4966:32;5007:31;5032:5;5007:31;:::i;:::-;5057:5;-1:-1:-1;5114:2:1;5099:18;;5086:32;5127:33;5086:32;5127:33;:::i;:::-;5179:7;5169:17;;;4728:464;;;;;:::o;5658:184::-;5710:77;5707:1;5700:88;5807:4;5804:1;5797:15;5831:4;5828:1;5821:15;5847:400;5994:2;5979:18;;6027:1;6016:13;;6006:201;;6063:77;6060:1;6053:88;6164:4;6161:1;6154:15;6192:4;6189:1;6182:15;6006:201;6216:25;;;5847:400;:::o;6252:388::-;6320:6;6328;6381:2;6369:9;6360:7;6356:23;6352:32;6349:52;;;6397:1;6394;6387:12;6349:52;6436:9;6423:23;6455:31;6480:5;6455:31;:::i;:::-;6505:5;-1:-1:-1;6562:2:1;6547:18;;6534:32;6575:33;6534:32;6575:33;:::i;6905:437::-;6984:1;6980:12;;;;7027;;;7048:61;;7102:4;7094:6;7090:17;7080:27;;7048:61;7155:2;7147:6;7144:14;7124:18;7121:38;7118:218;;7192:77;7189:1;7182:88;7293:4;7290:1;7283:15;7321:4;7318:1;7311:15;7118:218;;6905:437;;;:::o;7347:184::-;7399:77;7396:1;7389:88;7496:4;7493:1;7486:15;7520:4;7517:1;7510:15;7536:228;7576:7;7702:1;7634:66;7630:74;7627:1;7624:81;7619:1;7612:9;7605:17;7601:105;7598:131;;;7709:18;;:::i;:::-;-1:-1:-1;7749:9:1;;7536:228::o;7769:274::-;7809:1;7835;7825:189;;7870:77;7867:1;7860:88;7971:4;7968:1;7961:15;7999:4;7996:1;7989:15;7825:189;-1:-1:-1;8028:9:1;;7769:274::o;8048:128::-;8088:3;8119:1;8115:6;8112:1;8109:13;8106:39;;;8125:18;;:::i;:::-;-1:-1:-1;8161:9:1;;8048:128::o;8181:125::-;8221:4;8249:1;8246;8243:8;8240:34;;;8254:18;;:::i;:::-;-1:-1:-1;8291:9:1;;8181:125::o;9032:184::-;9102:6;9155:2;9143:9;9134:7;9130:23;9126:32;9123:52;;;9171:1;9168;9161:12;9123:52;-1:-1:-1;9194:16:1;;9032:184;-1:-1:-1;9032:184:1:o;9221:681::-;9392:2;9444:21;;;9514:13;;9417:18;;;9536:22;;;9363:4;;9392:2;9615:15;;;;9589:2;9574:18;;;9363:4;9658:218;9672:6;9669:1;9666:13;9658:218;;;9737:13;;9752:42;9733:62;9721:75;;9851:15;;;;9816:12;;;;9694:1;9687:9;9658:218;;;-1:-1:-1;9893:3:1;;9221:681;-1:-1:-1;;;;;;9221:681:1:o;13405:184::-;13457:77;13454:1;13447:88;13554:4;13551:1;13544:15;13578:4;13575:1;13568:15;13594:195;13633:3;13664:66;13657:5;13654:77;13651:103;;13734:18;;:::i;:::-;-1:-1:-1;13781:1:1;13770:13;;13594:195::o;15445:277::-;15512:6;15565:2;15553:9;15544:7;15540:23;15536:32;15533:52;;;15581:1;15578;15571:12;15533:52;15613:9;15607:16;15666:5;15659:13;15652:21;15645:5;15642:32;15632:60;;15688:1;15685;15678:12;18068:274;18197:3;18235:6;18229:13;18251:53;18297:6;18292:3;18285:4;18277:6;18273:17;18251:53;:::i;:::-;18320:16;;;;;18068:274;-1:-1:-1;;18068:274:1:o
Swarm Source
ipfs://278cee26ccc30daa8bb6f55d31d0a0cdc7ea4a072c0cdc957bd0425b820468c2
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.