Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 16689766 | 693 days ago | IN | 0 ETH | 0.00106505 |
Loading...
Loading
Contract Name:
dWill
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import './Interfaces/IHeritage.sol'; import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; contract dWill is IHeritage, Ownable{ using SafeERC20 for IERC20; ///@notice Stores all will/inheritance data. /// For clarity we use "will" to refer to wills created by owner and "inheritance" to refer to inheritance intended for heir, /// however "will" and "inheritance" refer to the same data types. WillData[] public willData; ///@notice The IDs of wills made by a person. mapping(address => uint256[]) public ownerWills; ///@notice Index where given ID is in ownerWills[owner] array. It is independent of owner because each will can have only one owner. mapping(uint256 => uint256) private indexOfOwnerWillsId; ///@notice Owner's token amounts in all their wills. Used to check if owner has enough allowance for new will/to increase will amount. mapping(address => mapping(IERC20 => uint256)) public willAmountForToken; ///@notice The IDs of inheritances intended for a person. mapping(address => uint256[]) public heirInheritances; ///@notice Index where given ID is in heirInheritances[heir] array. It is independent of heir because each inheritance can have only one heir. mapping(uint256 => uint256) private indexOfHeirInheritanceId; ///@notice Address the fees are sent to. address public feeCollector; ///@notice Fee amount collected from each withdrawal. Can be in range from 0% to 5%. [10^18 == 100%]. uint256 public fee; constructor(address _feeCollector, uint256 _fee) { _setFeeCollector(_feeCollector); _setFee(_fee); } /** * @notice Create the will will provided parameters. Checks if owner has enough allowance and calculates and calculates time interval for future use in resetTimers(). Emits AddWill event. * @param heir - Address to whom the tokens are inherited to. * @param token - Token to use in will. * @param withdrawalTime - Time when the heir will be able to withdraw tokens. * @param amount - Amount of tokens to send. * * @return ID - Id of the created will **/ function addWill( address heir, IERC20 token, uint256 withdrawalTime, uint256 amount ) external returns (uint256 ID){ require(heir != address(0), "dWill: Heir is address(0)"); require(address(token) != address(0), "dWill: Token is address(0)"); require(withdrawalTime > block.timestamp, "dWill: Withdrawal time has already expired"); require(amount != 0, "dWill: Amount is 0"); uint256 allowance = token.allowance(msg.sender, address(this)); unchecked { willAmountForToken[msg.sender][token] += amount; require(willAmountForToken[msg.sender][token] >= amount, "dWill: Total will for token is more than max uint256"); } require(allowance >= willAmountForToken[msg.sender][token], 'dWill: Not enough allowance'); ID = willData.length; WillData memory _data = WillData({ ID: ID, owner: msg.sender, heir: heir, token: token, creationTime: block.timestamp, withdrawalTime: withdrawalTime, timeInterval: withdrawalTime - block.timestamp, amount: amount, fee: fee, // We save fees at the moment of will creation to not have centralization with variable fees. done: false }); willData.push(_data); // We write indexes of ID in ownerWills/heirInheritances arrays to the mappings to get rid of for-loops later. indexOfOwnerWillsId[ID] = ownerWills[msg.sender].length; indexOfHeirInheritanceId[ID] = heirInheritances[heir].length; ownerWills[msg.sender].push(ID); heirInheritances[heir].push(ID); emit AddWill(ID, msg.sender, heir, token, withdrawalTime, amount); } /** * @notice Reset timers for all sender's wills depending on calculated timeInterval. Emits UpdateWithdrawalTime events. * @param IDs - IDs of wills to reset timers for. * @custom:example If heritage was created on 25.02.2040 and the timeInterval is 10 years * @custom:example then the withdrawal time is 25.02.2050, * @custom:example but if in 25.02.2041 the resetTimers is called * @custom:example withdrawal time will be 25.02.2051 (25.02.2041 + timeInterval) **/ function resetTimers(uint256[] memory IDs) external { for (uint256 i; i < IDs.length; i++) { WillData storage _data = willData[IDs[i]]; _checkWillAvailability(_data); uint256 _withdrawalTime = _data.timeInterval + block.timestamp; emit UpdateWithdrawalTime(IDs[i], _data.withdrawalTime, _withdrawalTime); _data.withdrawalTime = _withdrawalTime; } } /** * @notice Update time when heir can withdraw their tokens and timeInterval. Emits UpdateWithdrawalTime event. * @param ID - ID of will to update. * @param _withdrawalTime - New withdrawal time. **/ function updateWithdrawalTime(uint256 ID, uint256 _withdrawalTime) public { WillData storage _data = willData[ID]; _checkWillAvailability(_data); require(_withdrawalTime > _data.creationTime, "dWill: Withdrawal time has already expired"); emit UpdateWithdrawalTime(ID, _data.withdrawalTime, _withdrawalTime); _data.withdrawalTime = _withdrawalTime; _data.timeInterval = _withdrawalTime - _data.creationTime; } /** * @notice Sets new heir to the will. Emits UpdateHeir event. * @param ID - Id of the will to update. * @param _heir - New heir of the will. **/ function updateHeir(uint256 ID, address _heir) public { WillData storage _data = willData[ID]; _checkWillAvailability(_data); require(_data.heir != _heir, "dWill: New heir is the same"); require(_heir != address(0), "dWill: Heir is address(0)"); uint256[] storage _heirInheritances = heirInheritances[_data.heir]; uint256 i = indexOfHeirInheritanceId[ID]; uint256 _length = _heirInheritances.length - 1; if(i != _length){ _heirInheritances[i] = _heirInheritances[_length]; indexOfHeirInheritanceId[_heirInheritances[i]] = i; } _heirInheritances.pop(); indexOfHeirInheritanceId[ID] = heirInheritances[_heir].length; heirInheritances[_heir].push(ID); emit UpdateHeir(ID, _data.heir, _heir); _data.heir = _heir; } /** * @notice Set new amount to the will. Checks if owner has enough allowance. Emits UpdateAmount event. * @param ID - Id of the will to update. * @param _amount - New amount of the will. **/ function updateAmount(uint256 ID, uint256 _amount) public { WillData storage _data = willData[ID]; _checkWillAvailability(_data); uint256 allowance = _data.token.allowance(_data.owner, address(this)); unchecked { willAmountForToken[_data.owner][_data.token] = willAmountForToken[_data.owner][_data.token] - _data.amount + _amount; if(_amount > _data.amount){// If increased require(willAmountForToken[_data.owner][_data.token] >= _amount - _data.amount, "dWill: Total will for token is more than max uint256"); } } require(allowance >= willAmountForToken[_data.owner][_data.token], 'dWill: Not enough allowance'); emit UpdateAmount(ID, _data.amount, _amount); _data.amount = _amount; } /** * @notice Batch update will values. * @param ID - Id of the inheritwillance to update. * @param _withdrawalTime - New will withdrawal time. * @param _heir - New heir of the will. * @param _amount - New amount of the will. **/ function update( uint256 ID, uint256 _withdrawalTime, address _heir, uint256 _amount ) external { WillData memory _data = willData[ID]; if(_withdrawalTime != _data.withdrawalTime){ updateWithdrawalTime(ID, _withdrawalTime); } if (_heir != _data.heir) { updateHeir(ID, _heir); } if (_amount != _data.amount) { updateAmount(ID, _amount); } } /** * @notice Remove will from storage. Emits UpdaRemoveWillteHeir event. * @param ID - Id of the will to remove. **/ function removeWill(uint256 ID) external { WillData memory _data = willData[ID]; _checkWillAvailability(_data); uint256[] storage _ownerWills = ownerWills[_data.owner]; uint256 i = indexOfOwnerWillsId[ID]; uint256 _length = _ownerWills.length - 1; if(i != _length){ _ownerWills[i] = _ownerWills[_length]; indexOfOwnerWillsId[_ownerWills[i]] = i; } _ownerWills.pop(); uint256[] storage _heirInheritances = heirInheritances[_data.heir]; i = indexOfHeirInheritanceId[ID]; _length = _heirInheritances.length - 1; if(i != _length){ _heirInheritances[i] = _heirInheritances[_length]; indexOfHeirInheritanceId[_heirInheritances[i]] = i; } _heirInheritances.pop(); delete willData[ID]; willAmountForToken[_data.owner][_data.token] -= _data.amount; emit RemoveWill(ID, _data.owner, _data.heir); } /** * @notice Withdraw tokens to heir. Emits Withdraw event. * @param ID - Id of the inheritance to withdraw. * * @return amount - Amount withdrawn. **/ function withdraw(uint256 ID) external returns(uint256 amount){ WillData storage _data = willData[ID]; require(block.timestamp >= _data.withdrawalTime, "dWill: Withdrawal is not yet available"); require(msg.sender == _data.heir, "dWill: Caller is not the heir"); require(_data.done == false, "dWill: Already withdrawn"); _data.done = true; uint256[] storage _ownerWills = ownerWills[_data.owner]; uint256 i = indexOfOwnerWillsId[ID]; uint256 _length = _ownerWills.length - 1; if(i != _length){ _ownerWills[i] = _ownerWills[_length]; indexOfOwnerWillsId[_ownerWills[i]] = i; } _ownerWills.pop(); uint256[] storage _heirInheritances = heirInheritances[_data.heir]; i = indexOfHeirInheritanceId[ID]; _length = _heirInheritances.length - 1; if(i != _length){ _heirInheritances[i] = _heirInheritances[_length]; indexOfHeirInheritanceId[_heirInheritances[i]] = i; } _heirInheritances.pop(); uint256 balance = _data.token.balanceOf(_data.owner); uint256 allowance = _data.token.allowance(_data.owner, address(this)); amount = _data.amount; if (balance < amount) { amount = balance; } if (allowance < amount) { amount = allowance; } willAmountForToken[_data.owner][_data.token] -= amount; uint256 feeAmount = amount * _data.fee / 1 ether; if(feeAmount > 0){ _data.token.safeTransferFrom(_data.owner, feeCollector, feeAmount); emit CollectFee(ID, _data.token, feeAmount); amount -= feeAmount; } _data.token.safeTransferFrom(_data.owner, _data.heir, amount); emit Withdraw(ID, _data.owner, _data.heir, _data.token, block.timestamp, amount); } /** * @notice Returns owner's will at index. * @param owner - Owner of the will. * @param index - Index of the will in ownerWills to return. * * @return will - Info on will. **/ function getWill(address owner, uint256 index) external view returns(WillData memory will) { uint256[] memory _ownerWills = ownerWills[owner]; require(index < _ownerWills.length, "dWill: Index must be lower _heirInheritances.length"); will = willData[_ownerWills[index]]; } /** * @notice Returns user's inheritance at index. * @param heir - Heir of the inheritance. * @param index - Index of the inheritance in heirInheritances to return. * * @return inheritance - Info on inheritance. **/ function getInheritance(address heir, uint256 index) external view returns(WillData memory inheritance) { uint256[] memory _heirInheritances = heirInheritances[heir]; require(index < _heirInheritances.length, "dWill: Index must be lower _heirInheritances.length"); inheritance = willData[_heirInheritances[index]]; } function getWillsLength(address owner) external view returns(uint256 _length) { _length = ownerWills[owner].length; } function getInheritancesLength(address heir) external view returns(uint256 _length) { _length = heirInheritances[heir].length; } function _checkWillAvailability(WillData memory _data) internal view { require(_data.owner == msg.sender, "dWill: Caller is not the owner"); require(_data.done == false, "dWill: Already withdrawn"); } function setFeeCollector(address _feeCollector) external onlyOwner { _setFeeCollector(_feeCollector); } function setFee(uint256 _fee) external onlyOwner { _setFee(_fee); } function _setFeeCollector(address _feeCollector) internal { require (_feeCollector != address(0), "dWill: Can't set feeCollector to address(0)"); emit SetFeeCollector(feeCollector, _feeCollector); feeCollector = _feeCollector; } function _setFee(uint256 _fee) internal { require (_fee <= 50000000000000000, "dWill: Fee must be lower or equal 5%"); emit SetFee(fee, _fee); fee = _fee; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @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)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.17; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; interface IHeritage { struct WillData { uint256 ID; address owner; address heir; IERC20 token; uint256 creationTime; uint256 withdrawalTime; uint256 timeInterval; uint256 amount; uint256 fee; bool done; } event AddWill( uint256 indexed ID, address indexed owner, address indexed heir, IERC20 token, uint256 withdrawalTime, uint256 amount ); event UpdateWithdrawalTime( uint256 indexed ID, uint256 oldWithdrawalTime, uint256 newWithdrawalTime ); event UpdateHeir( uint256 indexed ID, address indexed oldHeir, address indexed newHeir ); event UpdateAmount( uint256 indexed ID, uint256 oldAmount, uint256 newAmount ); event RemoveWill( uint256 indexed ID, address indexed owner, address indexed heir ); event Withdraw( uint256 indexed ID, address indexed owner, address indexed heir, IERC20 token, uint256 time, uint256 amount ); event CollectFee( uint256 indexed ID, IERC20 indexed token, uint256 amount ); event SetFeeCollector( address indexed oldFeeCollector, address indexed newFeeCollector ); event SetFee( uint256 oldFee, uint256 newFee ); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_feeCollector","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"ID","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"heir","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"withdrawalTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddWill","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"ID","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CollectFee","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":"uint256","name":"ID","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"heir","type":"address"}],"name":"RemoveWill","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"SetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldFeeCollector","type":"address"},{"indexed":true,"internalType":"address","name":"newFeeCollector","type":"address"}],"name":"SetFeeCollector","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"ID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"UpdateAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"ID","type":"uint256"},{"indexed":true,"internalType":"address","name":"oldHeir","type":"address"},{"indexed":true,"internalType":"address","name":"newHeir","type":"address"}],"name":"UpdateHeir","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"ID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldWithdrawalTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWithdrawalTime","type":"uint256"}],"name":"UpdateWithdrawalTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"ID","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"heir","type":"address"},{"indexed":false,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"heir","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"withdrawalTime","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addWill","outputs":[{"internalType":"uint256","name":"ID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"heir","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getInheritance","outputs":[{"components":[{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"heir","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"withdrawalTime","type":"uint256"},{"internalType":"uint256","name":"timeInterval","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bool","name":"done","type":"bool"}],"internalType":"struct IHeritage.WillData","name":"inheritance","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"heir","type":"address"}],"name":"getInheritancesLength","outputs":[{"internalType":"uint256","name":"_length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getWill","outputs":[{"components":[{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"heir","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"withdrawalTime","type":"uint256"},{"internalType":"uint256","name":"timeInterval","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bool","name":"done","type":"bool"}],"internalType":"struct IHeritage.WillData","name":"will","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getWillsLength","outputs":[{"internalType":"uint256","name":"_length","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"heirInheritances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerWills","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ID","type":"uint256"}],"name":"removeWill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"IDs","type":"uint256[]"}],"name":"resetTimers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeCollector","type":"address"}],"name":"setFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"uint256","name":"_withdrawalTime","type":"uint256"},{"internalType":"address","name":"_heir","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"address","name":"_heir","type":"address"}],"name":"updateHeir","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"uint256","name":"_withdrawalTime","type":"uint256"}],"name":"updateWithdrawalTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"contract IERC20","name":"","type":"address"}],"name":"willAmountForToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"willData","outputs":[{"internalType":"uint256","name":"ID","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"heir","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"creationTime","type":"uint256"},{"internalType":"uint256","name":"withdrawalTime","type":"uint256"},{"internalType":"uint256","name":"timeInterval","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bool","name":"done","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ID","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200579a3803806200579a8339818101604052810190620000379190620003b8565b620000576200004b6200008160201b60201c565b6200008960201b60201c565b62000068826200014d60201b60201c565b62000079816200027f60201b60201c565b50506200057e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620001bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b69062000486565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9ea5568f737dfb292c6112b470f5deda06c5b264cdc5b29687cbf6f27a73964d60405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b66b1a2bc2ec50000811115620002cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c3906200051e565b60405180910390fd5b7f032dc6a2d839eb179729a55633fdf1c41a1fc4739394154117005db2b354b9b5600854826040516200030192919062000551565b60405180910390a18060088190555050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003458262000318565b9050919050565b620003578162000338565b81146200036357600080fd5b50565b60008151905062000377816200034c565b92915050565b6000819050919050565b62000392816200037d565b81146200039e57600080fd5b50565b600081519050620003b28162000387565b92915050565b60008060408385031215620003d257620003d162000313565b5b6000620003e28582860162000366565b9250506020620003f585828601620003a1565b9150509250929050565b600082825260208201905092915050565b7f6457696c6c3a2043616e27742073657420666565436f6c6c6563746f7220746f60008201527f2061646472657373283029000000000000000000000000000000000000000000602082015250565b60006200046e602b83620003ff565b91506200047b8262000410565b604082019050919050565b60006020820190508181036000830152620004a1816200045f565b9050919050565b7f6457696c6c3a20466565206d757374206265206c6f776572206f72206571756160008201527f6c20352500000000000000000000000000000000000000000000000000000000602082015250565b600062000506602483620003ff565b91506200051382620004a8565b604082019050919050565b600060208201905081810360008301526200053981620004f7565b9050919050565b6200054b816200037d565b82525050565b600060408201905062000568600083018562000540565b62000577602083018462000540565b9392505050565b61520c806200058e6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806381fb0ee7116100c3578063c415b95c1161007c578063c415b95c146103aa578063dc2e26ea146103c8578063ddca3f4314610401578063dfc0a6181461041f578063f2fde38b1461044f578063fc4d2f0e1461046b5761014d565b806381fb0ee7146102d85780638a617089146103085780638da5cb5b14610338578063a42dce8014610356578063a7457f3c14610372578063c23b0d3f1461038e5761014d565b80632e1a7d4d116101155780632e1a7d4d1461020657806343cc60b1146102365780636345843e1461025257806369fe0e2d14610282578063715018a61461029e578063747a2362146102a85761014d565b80630179cc52146101525780630469de051461016e5780630dbf05e41461018a578063272f20d6146101a65780632c80d9a7146101d6575b600080fd5b61016c60048036038101906101679190613d4f565b61049b565b005b61018860048036038101906101839190613d4f565b610afa565b005b6101a4600480360381019061019f9190613ded565b610d38565b005b6101c060048036038101906101bb9190613e2d565b61128e565b6040516101cd9190613fd1565b60405180910390f35b6101f060048036038101906101eb9190613e2d565b611515565b6040516101fd9190613ffc565b60405180910390f35b610220600480360381019061021b9190614017565b611546565b60405161022d9190613ffc565b60405180910390f35b610250600480360381019061024b9190614017565b611e72565b005b61026c60048036038101906102679190614044565b612418565b6040516102799190613ffc565b60405180910390f35b61029c60048036038101906102979190614017565b612464565b005b6102a6612478565b005b6102c260048036038101906102bd91906140af565b61248c565b6040516102cf9190613ffc565b60405180910390f35b6102f260048036038101906102ed9190613e2d565b612c71565b6040516102ff9190613fd1565b60405180910390f35b610322600480360381019061031d9190613e2d565b612ef8565b60405161032f9190613ffc565b60405180910390f35b610340612f29565b60405161034d9190614125565b60405180910390f35b610370600480360381019061036b9190614044565b612f52565b005b61038c60048036038101906103879190614299565b612f66565b005b6103a860048036038101906103a391906142e2565b6131ae565b005b6103b26133ae565b6040516103bf9190614125565b60405180910390f35b6103e260048036038101906103dd9190614017565b6133d4565b6040516103f89a99989796959493929190614367565b60405180910390f35b6104096134a5565b6040516104169190613ffc565b60405180910390f35b61043960048036038101906104349190614403565b6134ab565b6040516104469190613ffc565b60405180910390f35b61046960048036038101906104649190614044565b6134d0565b005b61048560048036038101906104809190614044565b613553565b6040516104929190613ffc565b60405180910390f35b6000600183815481106104b1576104b0614443565b5b90600052602060002090600a0201905061062f8160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505061359f565b60008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306040518363ffffffff1660e01b81526004016106b4929190614472565b602060405180830381865afa1580156106d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f591906144b0565b9050828260070154600460008560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540301600460008460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600701548311156109a65781600701548303600460008460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c90614560565b60405180910390fd5b5b600460008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008360030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811015610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa4906145cc565b60405180910390fd5b837fef32e85efc4b16a5db6af86cfb845c4b514b044cda661e397720bee512bde8f4836007015485604051610ae39291906145ec565b60405180910390a282826007018190555050505050565b600060018381548110610b1057610b0f614443565b5b90600052602060002090600a02019050610c8e8160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505061359f565b80600401548211610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb90614687565b60405180910390fd5b827f0895702ba21cdd0de9a3bf435016b294c4510ea28b4dff157b3d4bc0755ce6e6826005015484604051610d0a9291906145ec565b60405180910390a2818160050181905550806004015482610d2b91906146d6565b8160060181905550505050565b600060018381548110610d4e57610d4d614443565b5b90600052602060002090600a02019050610ecc8160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505061359f565b8173ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590614756565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc4906147c2565b60405180910390fd5b6000600560008360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006006600086815260200190815260200160002054905060006001838054905061105f91906146d6565b90508082146110dd5782818154811061107b5761107a614443565b5b906000526020600020015483838154811061109957611098614443565b5b906000526020600020018190555081600660008585815481106110bf576110be614443565b5b90600052602060002001548152602001908152602001600020819055505b828054806110ee576110ed6147e2565b5b60019003818190600052602060002001600090559055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600088815260200190815260200160002081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208690806001815401808255809150506001900390600052602060002001600090919091909150558473ffffffffffffffffffffffffffffffffffffffff168460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16877fb254e86e4a2583306d918edddac2d643aba365c5632f61a625930d649684357a60405160405180910390a4848460020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050565b611296613c6e565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561132157602002820191906000526020600020905b81548152602001906001019080831161130d575b505050505090508051831061136b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136290614883565b60405180910390fd5b60018184815181106113805761137f614443565b5b60200260200101518154811061139957611398614443565b5b90600052602060002090600a020160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505091505092915050565b6005602052816000526040600020818154811061153157600080fd5b90600052602060002001600091509150505481565b6000806001838154811061155d5761155c614443565b5b90600052602060002090600a0201905080600501544210156115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab90614915565b60405180910390fd5b8060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90614981565b60405180910390fd5b600015158160090160009054906101000a900460ff1615151461169e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611695906149ed565b60405180910390fd5b60018160090160006101000a81548160ff0219169083151502179055506000600260008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006003600086815260200190815260200160002054905060006001838054905061174d91906146d6565b90508082146117cb5782818154811061176957611768614443565b5b906000526020600020015483838154811061178757611786614443565b5b906000526020600020018190555081600360008585815481106117ad576117ac614443565b5b90600052602060002001548152602001908152602001600020819055505b828054806117dc576117db6147e2565b5b600190038181906000526020600020016000905590556000600560008660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600660008881526020019081526020016000205492506001818054905061188091906146d6565b91508183146118fe5780828154811061189c5761189b614443565b5b90600052602060002001548184815481106118ba576118b9614443565b5b906000526020600020018190555082600660008386815481106118e0576118df614443565b5b90600052602060002001548152602001908152602001600020819055505b8080548061190f5761190e6147e2565b5b6001900381819060005260206000200160009055905560008560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016119a89190614125565b602060405180830381865afa1580156119c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e991906144b0565b905060008660030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8860010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306040518363ffffffff1660e01b8152600401611a70929190614472565b602060405180830381865afa158015611a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab191906144b0565b90508660070154975087821015611ac6578197505b87811015611ad2578097505b87600460008960010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008960030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ba691906146d6565b925050819055506000670de0b6b3a764000088600801548a611bc89190614a0d565b611bd29190614a7e565b90506000811115611cf657611c748860010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838b60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613660909392919063ffffffff16565b8760030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a7fd4a05d00378fb0ed712cdbfde5101a2144caaec5d7c5adbcb7ecdcec0398d45683604051611cdf9190613ffc565b60405180910390a38089611cf391906146d6565b98505b611d8f8860010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168960020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168b8b60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613660909392919063ffffffff16565b8760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168860010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b7fae7c0fdf04394e630f0f88db0daac3232a0f060314499da12bfabe13dc9988ae8b60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16428e604051611e5d93929190614aaf565b60405180910390a45050505050505050919050565b600060018281548110611e8857611e87614443565b5b90600052602060002090600a020160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505090506120068161359f565b600060026000836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006003600085815260200190815260200160002054905060006001838054905061207891906146d6565b90508082146120f65782818154811061209457612093614443565b5b90600052602060002001548383815481106120b2576120b1614443565b5b906000526020600020018190555081600360008585815481106120d8576120d7614443565b5b90600052602060002001548152602001908152602001600020819055505b82805480612107576121066147e2565b5b60019003818190600052602060002001600090559055600060056000866040015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600660008781526020019081526020016000205492506001818054905061218b91906146d6565b9150818314612209578082815481106121a7576121a6614443565b5b90600052602060002001548184815481106121c5576121c4614443565b5b906000526020600020018190555082600660008386815481106121eb576121ea614443565b5b90600052602060002001548152602001908152602001600020819055505b8080548061221a576122196147e2565b5b600190038181906000526020600020016000905590556001868154811061224457612243614443565b5b90600052602060002090600a02016000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556003820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600482016000905560058201600090556006820160009055600782016000905560088201600090556009820160006101000a81549060ff021916905550508460e0015160046000876020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000876060015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123a691906146d6565b92505081905550846040015173ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff16877f2e6ce80b05d67b5aba812f8e95333d141bb7fd2d335f955800635cfdbbb8630e60405160405180910390a4505050505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b61246c6136e9565b61247581613767565b50565b6124806136e9565b61248a60006137f6565b565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036124fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f3906147c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361256b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256290614b32565b60405180910390fd5b4283116125ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a490614687565b60405180910390fd5b600082036125f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e790614b9e565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161262d929190614472565b602060405180830381865afa15801561264a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266e91906144b0565b905082600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555082600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156127b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b090614560565b60405180910390fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811015612878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286f906145cc565b60405180910390fd5b600180549050915060006040518061014001604052808481526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001428152602001868152602001428761290091906146d6565b8152602001858152602001600854815260200160001515815250905060018190806001815401808255809150506001900390600052602060002090600a02016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a81548160ff0219169083151502179055505050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506003600085815260200190815260200160002081905550600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600085815260200190815260200160002081905550600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190915055600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208390806001815401808255809150506001900390600052602060002001600090919091909150558673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16847f85d017ff3a7e23e1a84ecf47aa05db16f3b877868ba03ecbcbb8238427dc66e0898989604051612c5f93929190614aaf565b60405180910390a45050949350505050565b612c79613c6e565b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015612d0457602002820191906000526020600020905b815481526020019060010190808311612cf0575b5050505050905080518310612d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4590614883565b60405180910390fd5b6001818481518110612d6357612d62614443565b5b602002602001015181548110612d7c57612d7b614443565b5b90600052602060002090600a020160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505091505092915050565b60026020528160005260406000208181548110612f1457600080fd5b90600052602060002001600091509150505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612f5a6136e9565b612f63816138ba565b50565b60005b81518110156131aa5760006001838381518110612f8957612f88614443565b5b602002602001015181548110612fa257612fa1614443565b5b90600052602060002090600a020190506131208160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505061359f565b60004282600601546131329190614bbe565b905083838151811061314757613146614443565b5b60200260200101517f0895702ba21cdd0de9a3bf435016b294c4510ea28b4dff157b3d4bc0755ce6e68360050154836040516131849291906145ec565b60405180910390a2808260050181905550505080806131a290614bf2565b915050612f69565b5050565b6000600185815481106131c4576131c3614443565b5b90600052602060002090600a020160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505090508060a00151841461334f5761334e8585610afa565b5b806040015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613391576133908584610d38565b5b8060e0015182146133a7576133a6858361049b565b5b5050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600181815481106133e457600080fd5b90600052602060002090600a02016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154908060050154908060060154908060070154908060080154908060090160009054906101000a900460ff1690508a565b60085481565b6004602052816000526040600020602052806000526040600020600091509150505481565b6134d86136e9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353e90614cac565b60405180910390fd5b613550816137f6565b50565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b3373ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff1614613611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360890614d18565b60405180910390fd5b6000151581610120015115151461365d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613654906149ed565b60405180910390fd5b50565b6136e3846323b872dd60e01b85858560405160240161368193929190614d38565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139e9565b50505050565b6136f1613ab0565b73ffffffffffffffffffffffffffffffffffffffff1661370f612f29565b73ffffffffffffffffffffffffffffffffffffffff1614613765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375c90614dbb565b60405180910390fd5b565b66b1a2bc2ec500008111156137b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a890614e4d565b60405180910390fd5b7f032dc6a2d839eb179729a55633fdf1c41a1fc4739394154117005db2b354b9b5600854826040516137e49291906145ec565b60405180910390a18060088190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161392090614edf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9ea5568f737dfb292c6112b470f5deda06c5b264cdc5b29687cbf6f27a73964d60405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000613a4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613ab89092919063ffffffff16565b9050600081511115613aab5780806020019051810190613a6b9190614f2b565b613aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aa190614fca565b60405180910390fd5b5b505050565b600033905090565b6060613ac78484600085613ad0565b90509392505050565b606082471015613b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0c9061505c565b60405180910390fd5b613b1e85613be4565b613b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b54906150c8565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613b869190615159565b60006040518083038185875af1925050503d8060008114613bc3576040519150601f19603f3d011682016040523d82523d6000602084013e613bc8565b606091505b5091509150613bd8828286613c07565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315613c1757829050613c67565b600083511115613c2a5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c5e91906151b4565b60405180910390fd5b9392505050565b60405180610140016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613d2c81613d19565b8114613d3757600080fd5b50565b600081359050613d4981613d23565b92915050565b60008060408385031215613d6657613d65613d0f565b5b6000613d7485828601613d3a565b9250506020613d8585828601613d3a565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613dba82613d8f565b9050919050565b613dca81613daf565b8114613dd557600080fd5b50565b600081359050613de781613dc1565b92915050565b60008060408385031215613e0457613e03613d0f565b5b6000613e1285828601613d3a565b9250506020613e2385828601613dd8565b9150509250929050565b60008060408385031215613e4457613e43613d0f565b5b6000613e5285828601613dd8565b9250506020613e6385828601613d3a565b9150509250929050565b613e7681613d19565b82525050565b613e8581613daf565b82525050565b6000819050919050565b6000613eb0613eab613ea684613d8f565b613e8b565b613d8f565b9050919050565b6000613ec282613e95565b9050919050565b6000613ed482613eb7565b9050919050565b613ee481613ec9565b82525050565b60008115159050919050565b613eff81613eea565b82525050565b61014082016000820151613f1c6000850182613e6d565b506020820151613f2f6020850182613e7c565b506040820151613f426040850182613e7c565b506060820151613f556060850182613edb565b506080820151613f686080850182613e6d565b5060a0820151613f7b60a0850182613e6d565b5060c0820151613f8e60c0850182613e6d565b5060e0820151613fa160e0850182613e6d565b50610100820151613fb6610100850182613e6d565b50610120820151613fcb610120850182613ef6565b50505050565b600061014082019050613fe76000830184613f05565b92915050565b613ff681613d19565b82525050565b60006020820190506140116000830184613fed565b92915050565b60006020828403121561402d5761402c613d0f565b5b600061403b84828501613d3a565b91505092915050565b60006020828403121561405a57614059613d0f565b5b600061406884828501613dd8565b91505092915050565b600061407c82613daf565b9050919050565b61408c81614071565b811461409757600080fd5b50565b6000813590506140a981614083565b92915050565b600080600080608085870312156140c9576140c8613d0f565b5b60006140d787828801613dd8565b94505060206140e88782880161409a565b93505060406140f987828801613d3a565b925050606061410a87828801613d3a565b91505092959194509250565b61411f81613daf565b82525050565b600060208201905061413a6000830184614116565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61418e82614145565b810181811067ffffffffffffffff821117156141ad576141ac614156565b5b80604052505050565b60006141c0613d05565b90506141cc8282614185565b919050565b600067ffffffffffffffff8211156141ec576141eb614156565b5b602082029050602081019050919050565b600080fd5b6000614215614210846141d1565b6141b6565b90508083825260208201905060208402830185811115614238576142376141fd565b5b835b81811015614261578061424d8882613d3a565b84526020840193505060208101905061423a565b5050509392505050565b600082601f8301126142805761427f614140565b5b8135614290848260208601614202565b91505092915050565b6000602082840312156142af576142ae613d0f565b5b600082013567ffffffffffffffff8111156142cd576142cc613d14565b5b6142d98482850161426b565b91505092915050565b600080600080608085870312156142fc576142fb613d0f565b5b600061430a87828801613d3a565b945050602061431b87828801613d3a565b935050604061432c87828801613dd8565b925050606061433d87828801613d3a565b91505092959194509250565b61435281613ec9565b82525050565b61436181613eea565b82525050565b60006101408201905061437d600083018d613fed565b61438a602083018c614116565b614397604083018b614116565b6143a4606083018a614349565b6143b16080830189613fed565b6143be60a0830188613fed565b6143cb60c0830187613fed565b6143d860e0830186613fed565b6143e6610100830185613fed565b6143f4610120830184614358565b9b9a5050505050505050505050565b6000806040838503121561441a57614419613d0f565b5b600061442885828601613dd8565b92505060206144398582860161409a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006040820190506144876000830185614116565b6144946020830184614116565b9392505050565b6000815190506144aa81613d23565b92915050565b6000602082840312156144c6576144c5613d0f565b5b60006144d48482850161449b565b91505092915050565b600082825260208201905092915050565b7f6457696c6c3a20546f74616c2077696c6c20666f7220746f6b656e206973206d60008201527f6f7265207468616e206d61782075696e74323536000000000000000000000000602082015250565b600061454a6034836144dd565b9150614555826144ee565b604082019050919050565b600060208201905081810360008301526145798161453d565b9050919050565b7f6457696c6c3a204e6f7420656e6f75676820616c6c6f77616e63650000000000600082015250565b60006145b6601b836144dd565b91506145c182614580565b602082019050919050565b600060208201905081810360008301526145e5816145a9565b9050919050565b60006040820190506146016000830185613fed565b61460e6020830184613fed565b9392505050565b7f6457696c6c3a205769746864726177616c2074696d652068617320616c72656160008201527f6479206578706972656400000000000000000000000000000000000000000000602082015250565b6000614671602a836144dd565b915061467c82614615565b604082019050919050565b600060208201905081810360008301526146a081614664565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146e182613d19565b91506146ec83613d19565b9250828203905081811115614704576147036146a7565b5b92915050565b7f6457696c6c3a204e65772068656972206973207468652073616d650000000000600082015250565b6000614740601b836144dd565b915061474b8261470a565b602082019050919050565b6000602082019050818103600083015261476f81614733565b9050919050565b7f6457696c6c3a2048656972206973206164647265737328302900000000000000600082015250565b60006147ac6019836144dd565b91506147b782614776565b602082019050919050565b600060208201905081810360008301526147db8161479f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f6457696c6c3a20496e646578206d757374206265206c6f776572205f6865697260008201527f496e6865726974616e6365732e6c656e67746800000000000000000000000000602082015250565b600061486d6033836144dd565b915061487882614811565b604082019050919050565b6000602082019050818103600083015261489c81614860565b9050919050565b7f6457696c6c3a205769746864726177616c206973206e6f74207965742061766160008201527f696c61626c650000000000000000000000000000000000000000000000000000602082015250565b60006148ff6026836144dd565b915061490a826148a3565b604082019050919050565b6000602082019050818103600083015261492e816148f2565b9050919050565b7f6457696c6c3a2043616c6c6572206973206e6f74207468652068656972000000600082015250565b600061496b601d836144dd565b915061497682614935565b602082019050919050565b6000602082019050818103600083015261499a8161495e565b9050919050565b7f6457696c6c3a20416c72656164792077697468647261776e0000000000000000600082015250565b60006149d76018836144dd565b91506149e2826149a1565b602082019050919050565b60006020820190508181036000830152614a06816149ca565b9050919050565b6000614a1882613d19565b9150614a2383613d19565b9250828202614a3181613d19565b91508282048414831517614a4857614a476146a7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a8982613d19565b9150614a9483613d19565b925082614aa457614aa3614a4f565b5b828204905092915050565b6000606082019050614ac46000830186614349565b614ad16020830185613fed565b614ade6040830184613fed565b949350505050565b7f6457696c6c3a20546f6b656e2069732061646472657373283029000000000000600082015250565b6000614b1c601a836144dd565b9150614b2782614ae6565b602082019050919050565b60006020820190508181036000830152614b4b81614b0f565b9050919050565b7f6457696c6c3a20416d6f756e7420697320300000000000000000000000000000600082015250565b6000614b886012836144dd565b9150614b9382614b52565b602082019050919050565b60006020820190508181036000830152614bb781614b7b565b9050919050565b6000614bc982613d19565b9150614bd483613d19565b9250828201905080821115614bec57614beb6146a7565b5b92915050565b6000614bfd82613d19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c2f57614c2e6146a7565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c966026836144dd565b9150614ca182614c3a565b604082019050919050565b60006020820190508181036000830152614cc581614c89565b9050919050565b7f6457696c6c3a2043616c6c6572206973206e6f7420746865206f776e65720000600082015250565b6000614d02601e836144dd565b9150614d0d82614ccc565b602082019050919050565b60006020820190508181036000830152614d3181614cf5565b9050919050565b6000606082019050614d4d6000830186614116565b614d5a6020830185614116565b614d676040830184613fed565b949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614da56020836144dd565b9150614db082614d6f565b602082019050919050565b60006020820190508181036000830152614dd481614d98565b9050919050565b7f6457696c6c3a20466565206d757374206265206c6f776572206f72206571756160008201527f6c20352500000000000000000000000000000000000000000000000000000000602082015250565b6000614e376024836144dd565b9150614e4282614ddb565b604082019050919050565b60006020820190508181036000830152614e6681614e2a565b9050919050565b7f6457696c6c3a2043616e27742073657420666565436f6c6c6563746f7220746f60008201527f2061646472657373283029000000000000000000000000000000000000000000602082015250565b6000614ec9602b836144dd565b9150614ed482614e6d565b604082019050919050565b60006020820190508181036000830152614ef881614ebc565b9050919050565b614f0881613eea565b8114614f1357600080fd5b50565b600081519050614f2581614eff565b92915050565b600060208284031215614f4157614f40613d0f565b5b6000614f4f84828501614f16565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614fb4602a836144dd565b9150614fbf82614f58565b604082019050919050565b60006020820190508181036000830152614fe381614fa7565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006150466026836144dd565b915061505182614fea565b604082019050919050565b6000602082019050818103600083015261507581615039565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006150b2601d836144dd565b91506150bd8261507c565b602082019050919050565b600060208201905081810360008301526150e1816150a5565b9050919050565b600081519050919050565b600081905092915050565b60005b8381101561511c578082015181840152602081019050615101565b60008484015250505050565b6000615133826150e8565b61513d81856150f3565b935061514d8185602086016150fe565b80840191505092915050565b60006151658284615128565b915081905092915050565b600081519050919050565b600061518682615170565b61519081856144dd565b93506151a08185602086016150fe565b6151a981614145565b840191505092915050565b600060208201905081810360008301526151ce818461517b565b90509291505056fea2646970667358221220233a27c66263b635449027d1a2bee168ddeb5920fb688e8dc665747c2f7a59b264736f6c63430008110033000000000000000000000000e8d562606f35cb14da3e8fab1174f9b5ae8319c4000000000000000000000000000000000000000000000000006a94d74f430000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806381fb0ee7116100c3578063c415b95c1161007c578063c415b95c146103aa578063dc2e26ea146103c8578063ddca3f4314610401578063dfc0a6181461041f578063f2fde38b1461044f578063fc4d2f0e1461046b5761014d565b806381fb0ee7146102d85780638a617089146103085780638da5cb5b14610338578063a42dce8014610356578063a7457f3c14610372578063c23b0d3f1461038e5761014d565b80632e1a7d4d116101155780632e1a7d4d1461020657806343cc60b1146102365780636345843e1461025257806369fe0e2d14610282578063715018a61461029e578063747a2362146102a85761014d565b80630179cc52146101525780630469de051461016e5780630dbf05e41461018a578063272f20d6146101a65780632c80d9a7146101d6575b600080fd5b61016c60048036038101906101679190613d4f565b61049b565b005b61018860048036038101906101839190613d4f565b610afa565b005b6101a4600480360381019061019f9190613ded565b610d38565b005b6101c060048036038101906101bb9190613e2d565b61128e565b6040516101cd9190613fd1565b60405180910390f35b6101f060048036038101906101eb9190613e2d565b611515565b6040516101fd9190613ffc565b60405180910390f35b610220600480360381019061021b9190614017565b611546565b60405161022d9190613ffc565b60405180910390f35b610250600480360381019061024b9190614017565b611e72565b005b61026c60048036038101906102679190614044565b612418565b6040516102799190613ffc565b60405180910390f35b61029c60048036038101906102979190614017565b612464565b005b6102a6612478565b005b6102c260048036038101906102bd91906140af565b61248c565b6040516102cf9190613ffc565b60405180910390f35b6102f260048036038101906102ed9190613e2d565b612c71565b6040516102ff9190613fd1565b60405180910390f35b610322600480360381019061031d9190613e2d565b612ef8565b60405161032f9190613ffc565b60405180910390f35b610340612f29565b60405161034d9190614125565b60405180910390f35b610370600480360381019061036b9190614044565b612f52565b005b61038c60048036038101906103879190614299565b612f66565b005b6103a860048036038101906103a391906142e2565b6131ae565b005b6103b26133ae565b6040516103bf9190614125565b60405180910390f35b6103e260048036038101906103dd9190614017565b6133d4565b6040516103f89a99989796959493929190614367565b60405180910390f35b6104096134a5565b6040516104169190613ffc565b60405180910390f35b61043960048036038101906104349190614403565b6134ab565b6040516104469190613ffc565b60405180910390f35b61046960048036038101906104649190614044565b6134d0565b005b61048560048036038101906104809190614044565b613553565b6040516104929190613ffc565b60405180910390f35b6000600183815481106104b1576104b0614443565b5b90600052602060002090600a0201905061062f8160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505061359f565b60008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306040518363ffffffff1660e01b81526004016106b4929190614472565b602060405180830381865afa1580156106d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f591906144b0565b9050828260070154600460008560010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540301600460008460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600701548311156109a65781600701548303600460008460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008460030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c90614560565b60405180910390fd5b5b600460008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008360030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811015610aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa4906145cc565b60405180910390fd5b837fef32e85efc4b16a5db6af86cfb845c4b514b044cda661e397720bee512bde8f4836007015485604051610ae39291906145ec565b60405180910390a282826007018190555050505050565b600060018381548110610b1057610b0f614443565b5b90600052602060002090600a02019050610c8e8160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505061359f565b80600401548211610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb90614687565b60405180910390fd5b827f0895702ba21cdd0de9a3bf435016b294c4510ea28b4dff157b3d4bc0755ce6e6826005015484604051610d0a9291906145ec565b60405180910390a2818160050181905550806004015482610d2b91906146d6565b8160060181905550505050565b600060018381548110610d4e57610d4d614443565b5b90600052602060002090600a02019050610ecc8160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505061359f565b8173ffffffffffffffffffffffffffffffffffffffff168160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590614756565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc4906147c2565b60405180910390fd5b6000600560008360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006006600086815260200190815260200160002054905060006001838054905061105f91906146d6565b90508082146110dd5782818154811061107b5761107a614443565b5b906000526020600020015483838154811061109957611098614443565b5b906000526020600020018190555081600660008585815481106110bf576110be614443565b5b90600052602060002001548152602001908152602001600020819055505b828054806110ee576110ed6147e2565b5b60019003818190600052602060002001600090559055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600088815260200190815260200160002081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208690806001815401808255809150506001900390600052602060002001600090919091909150558473ffffffffffffffffffffffffffffffffffffffff168460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16877fb254e86e4a2583306d918edddac2d643aba365c5632f61a625930d649684357a60405160405180910390a4848460020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505050565b611296613c6e565b6000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561132157602002820191906000526020600020905b81548152602001906001019080831161130d575b505050505090508051831061136b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136290614883565b60405180910390fd5b60018184815181106113805761137f614443565b5b60200260200101518154811061139957611398614443565b5b90600052602060002090600a020160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505091505092915050565b6005602052816000526040600020818154811061153157600080fd5b90600052602060002001600091509150505481565b6000806001838154811061155d5761155c614443565b5b90600052602060002090600a0201905080600501544210156115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab90614915565b60405180910390fd5b8060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163d90614981565b60405180910390fd5b600015158160090160009054906101000a900460ff1615151461169e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611695906149ed565b60405180910390fd5b60018160090160006101000a81548160ff0219169083151502179055506000600260008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006003600086815260200190815260200160002054905060006001838054905061174d91906146d6565b90508082146117cb5782818154811061176957611768614443565b5b906000526020600020015483838154811061178757611786614443565b5b906000526020600020018190555081600360008585815481106117ad576117ac614443565b5b90600052602060002001548152602001908152602001600020819055505b828054806117dc576117db6147e2565b5b600190038181906000526020600020016000905590556000600560008660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600660008881526020019081526020016000205492506001818054905061188091906146d6565b91508183146118fe5780828154811061189c5761189b614443565b5b90600052602060002001548184815481106118ba576118b9614443565b5b906000526020600020018190555082600660008386815481106118e0576118df614443565b5b90600052602060002001548152602001908152602001600020819055505b8080548061190f5761190e6147e2565b5b6001900381819060005260206000200160009055905560008560030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082318760010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b81526004016119a89190614125565b602060405180830381865afa1580156119c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e991906144b0565b905060008660030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e8860010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16306040518363ffffffff1660e01b8152600401611a70929190614472565b602060405180830381865afa158015611a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab191906144b0565b90508660070154975087821015611ac6578197505b87811015611ad2578097505b87600460008960010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008960030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ba691906146d6565b925050819055506000670de0b6b3a764000088600801548a611bc89190614a0d565b611bd29190614a7e565b90506000811115611cf657611c748860010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838b60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613660909392919063ffffffff16565b8760030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168a7fd4a05d00378fb0ed712cdbfde5101a2144caaec5d7c5adbcb7ecdcec0398d45683604051611cdf9190613ffc565b60405180910390a38089611cf391906146d6565b98505b611d8f8860010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168960020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168b8b60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16613660909392919063ffffffff16565b8760020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168860010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b7fae7c0fdf04394e630f0f88db0daac3232a0f060314499da12bfabe13dc9988ae8b60030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16428e604051611e5d93929190614aaf565b60405180910390a45050505050505050919050565b600060018281548110611e8857611e87614443565b5b90600052602060002090600a020160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505090506120068161359f565b600060026000836020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006003600085815260200190815260200160002054905060006001838054905061207891906146d6565b90508082146120f65782818154811061209457612093614443565b5b90600052602060002001548383815481106120b2576120b1614443565b5b906000526020600020018190555081600360008585815481106120d8576120d7614443565b5b90600052602060002001548152602001908152602001600020819055505b82805480612107576121066147e2565b5b60019003818190600052602060002001600090559055600060056000866040015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600660008781526020019081526020016000205492506001818054905061218b91906146d6565b9150818314612209578082815481106121a7576121a6614443565b5b90600052602060002001548184815481106121c5576121c4614443565b5b906000526020600020018190555082600660008386815481106121eb576121ea614443565b5b90600052602060002001548152602001908152602001600020819055505b8080548061221a576122196147e2565b5b600190038181906000526020600020016000905590556001868154811061224457612243614443565b5b90600052602060002090600a02016000808201600090556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556003820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600482016000905560058201600090556006820160009055600782016000905560088201600090556009820160006101000a81549060ff021916905550508460e0015160046000876020015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000876060015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123a691906146d6565b92505081905550846040015173ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff16877f2e6ce80b05d67b5aba812f8e95333d141bb7fd2d335f955800635cfdbbb8630e60405160405180910390a4505050505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b61246c6136e9565b61247581613767565b50565b6124806136e9565b61248a60006137f6565b565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036124fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f3906147c2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361256b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256290614b32565b60405180910390fd5b4283116125ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a490614687565b60405180910390fd5b600082036125f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e790614b9e565b60405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b815260040161262d929190614472565b602060405180830381865afa15801561264a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061266e91906144b0565b905082600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555082600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156127b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b090614560565b60405180910390fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811015612878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286f906145cc565b60405180910390fd5b600180549050915060006040518061014001604052808481526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff168152602001428152602001868152602001428761290091906146d6565b8152602001858152602001600854815260200160001515815250905060018190806001815401808255809150506001900390600052602060002090600a02016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a81548160ff0219169083151502179055505050600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506003600085815260200190815260200160002081905550600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600085815260200190815260200160002081905550600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020839080600181540180825580915050600190039060005260206000200160009091909190915055600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208390806001815401808255809150506001900390600052602060002001600090919091909150558673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16847f85d017ff3a7e23e1a84ecf47aa05db16f3b877868ba03ecbcbb8238427dc66e0898989604051612c5f93929190614aaf565b60405180910390a45050949350505050565b612c79613c6e565b6000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015612d0457602002820191906000526020600020905b815481526020019060010190808311612cf0575b5050505050905080518310612d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4590614883565b60405180910390fd5b6001818481518110612d6357612d62614443565b5b602002602001015181548110612d7c57612d7b614443565b5b90600052602060002090600a020160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505091505092915050565b60026020528160005260406000208181548110612f1457600080fd5b90600052602060002001600091509150505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612f5a6136e9565b612f63816138ba565b50565b60005b81518110156131aa5760006001838381518110612f8957612f88614443565b5b602002602001015181548110612fa257612fa1614443565b5b90600052602060002090600a020190506131208160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505061359f565b60004282600601546131329190614bbe565b905083838151811061314757613146614443565b5b60200260200101517f0895702ba21cdd0de9a3bf435016b294c4510ea28b4dff157b3d4bc0755ce6e68360050154836040516131849291906145ec565b60405180910390a2808260050181905550505080806131a290614bf2565b915050612f69565b5050565b6000600185815481106131c4576131c3614443565b5b90600052602060002090600a020160405180610140016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900460ff16151515158152505090508060a00151841461334f5761334e8585610afa565b5b806040015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613391576133908584610d38565b5b8060e0015182146133a7576133a6858361049b565b5b5050505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600181815481106133e457600080fd5b90600052602060002090600a02016000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060040154908060050154908060060154908060070154908060080154908060090160009054906101000a900460ff1690508a565b60085481565b6004602052816000526040600020602052806000526040600020600091509150505481565b6134d86136e9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353e90614cac565b60405180910390fd5b613550816137f6565b50565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b3373ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff1614613611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360890614d18565b60405180910390fd5b6000151581610120015115151461365d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613654906149ed565b60405180910390fd5b50565b6136e3846323b872dd60e01b85858560405160240161368193929190614d38565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139e9565b50505050565b6136f1613ab0565b73ffffffffffffffffffffffffffffffffffffffff1661370f612f29565b73ffffffffffffffffffffffffffffffffffffffff1614613765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375c90614dbb565b60405180910390fd5b565b66b1a2bc2ec500008111156137b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a890614e4d565b60405180910390fd5b7f032dc6a2d839eb179729a55633fdf1c41a1fc4739394154117005db2b354b9b5600854826040516137e49291906145ec565b60405180910390a18060088190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161392090614edf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9ea5568f737dfb292c6112b470f5deda06c5b264cdc5b29687cbf6f27a73964d60405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000613a4b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613ab89092919063ffffffff16565b9050600081511115613aab5780806020019051810190613a6b9190614f2b565b613aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aa190614fca565b60405180910390fd5b5b505050565b600033905090565b6060613ac78484600085613ad0565b90509392505050565b606082471015613b15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0c9061505c565b60405180910390fd5b613b1e85613be4565b613b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b54906150c8565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613b869190615159565b60006040518083038185875af1925050503d8060008114613bc3576040519150601f19603f3d011682016040523d82523d6000602084013e613bc8565b606091505b5091509150613bd8828286613c07565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315613c1757829050613c67565b600083511115613c2a5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c5e91906151b4565b60405180910390fd5b9392505050565b60405180610140016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613d2c81613d19565b8114613d3757600080fd5b50565b600081359050613d4981613d23565b92915050565b60008060408385031215613d6657613d65613d0f565b5b6000613d7485828601613d3a565b9250506020613d8585828601613d3a565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613dba82613d8f565b9050919050565b613dca81613daf565b8114613dd557600080fd5b50565b600081359050613de781613dc1565b92915050565b60008060408385031215613e0457613e03613d0f565b5b6000613e1285828601613d3a565b9250506020613e2385828601613dd8565b9150509250929050565b60008060408385031215613e4457613e43613d0f565b5b6000613e5285828601613dd8565b9250506020613e6385828601613d3a565b9150509250929050565b613e7681613d19565b82525050565b613e8581613daf565b82525050565b6000819050919050565b6000613eb0613eab613ea684613d8f565b613e8b565b613d8f565b9050919050565b6000613ec282613e95565b9050919050565b6000613ed482613eb7565b9050919050565b613ee481613ec9565b82525050565b60008115159050919050565b613eff81613eea565b82525050565b61014082016000820151613f1c6000850182613e6d565b506020820151613f2f6020850182613e7c565b506040820151613f426040850182613e7c565b506060820151613f556060850182613edb565b506080820151613f686080850182613e6d565b5060a0820151613f7b60a0850182613e6d565b5060c0820151613f8e60c0850182613e6d565b5060e0820151613fa160e0850182613e6d565b50610100820151613fb6610100850182613e6d565b50610120820151613fcb610120850182613ef6565b50505050565b600061014082019050613fe76000830184613f05565b92915050565b613ff681613d19565b82525050565b60006020820190506140116000830184613fed565b92915050565b60006020828403121561402d5761402c613d0f565b5b600061403b84828501613d3a565b91505092915050565b60006020828403121561405a57614059613d0f565b5b600061406884828501613dd8565b91505092915050565b600061407c82613daf565b9050919050565b61408c81614071565b811461409757600080fd5b50565b6000813590506140a981614083565b92915050565b600080600080608085870312156140c9576140c8613d0f565b5b60006140d787828801613dd8565b94505060206140e88782880161409a565b93505060406140f987828801613d3a565b925050606061410a87828801613d3a565b91505092959194509250565b61411f81613daf565b82525050565b600060208201905061413a6000830184614116565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61418e82614145565b810181811067ffffffffffffffff821117156141ad576141ac614156565b5b80604052505050565b60006141c0613d05565b90506141cc8282614185565b919050565b600067ffffffffffffffff8211156141ec576141eb614156565b5b602082029050602081019050919050565b600080fd5b6000614215614210846141d1565b6141b6565b90508083825260208201905060208402830185811115614238576142376141fd565b5b835b81811015614261578061424d8882613d3a565b84526020840193505060208101905061423a565b5050509392505050565b600082601f8301126142805761427f614140565b5b8135614290848260208601614202565b91505092915050565b6000602082840312156142af576142ae613d0f565b5b600082013567ffffffffffffffff8111156142cd576142cc613d14565b5b6142d98482850161426b565b91505092915050565b600080600080608085870312156142fc576142fb613d0f565b5b600061430a87828801613d3a565b945050602061431b87828801613d3a565b935050604061432c87828801613dd8565b925050606061433d87828801613d3a565b91505092959194509250565b61435281613ec9565b82525050565b61436181613eea565b82525050565b60006101408201905061437d600083018d613fed565b61438a602083018c614116565b614397604083018b614116565b6143a4606083018a614349565b6143b16080830189613fed565b6143be60a0830188613fed565b6143cb60c0830187613fed565b6143d860e0830186613fed565b6143e6610100830185613fed565b6143f4610120830184614358565b9b9a5050505050505050505050565b6000806040838503121561441a57614419613d0f565b5b600061442885828601613dd8565b92505060206144398582860161409a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006040820190506144876000830185614116565b6144946020830184614116565b9392505050565b6000815190506144aa81613d23565b92915050565b6000602082840312156144c6576144c5613d0f565b5b60006144d48482850161449b565b91505092915050565b600082825260208201905092915050565b7f6457696c6c3a20546f74616c2077696c6c20666f7220746f6b656e206973206d60008201527f6f7265207468616e206d61782075696e74323536000000000000000000000000602082015250565b600061454a6034836144dd565b9150614555826144ee565b604082019050919050565b600060208201905081810360008301526145798161453d565b9050919050565b7f6457696c6c3a204e6f7420656e6f75676820616c6c6f77616e63650000000000600082015250565b60006145b6601b836144dd565b91506145c182614580565b602082019050919050565b600060208201905081810360008301526145e5816145a9565b9050919050565b60006040820190506146016000830185613fed565b61460e6020830184613fed565b9392505050565b7f6457696c6c3a205769746864726177616c2074696d652068617320616c72656160008201527f6479206578706972656400000000000000000000000000000000000000000000602082015250565b6000614671602a836144dd565b915061467c82614615565b604082019050919050565b600060208201905081810360008301526146a081614664565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146e182613d19565b91506146ec83613d19565b9250828203905081811115614704576147036146a7565b5b92915050565b7f6457696c6c3a204e65772068656972206973207468652073616d650000000000600082015250565b6000614740601b836144dd565b915061474b8261470a565b602082019050919050565b6000602082019050818103600083015261476f81614733565b9050919050565b7f6457696c6c3a2048656972206973206164647265737328302900000000000000600082015250565b60006147ac6019836144dd565b91506147b782614776565b602082019050919050565b600060208201905081810360008301526147db8161479f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f6457696c6c3a20496e646578206d757374206265206c6f776572205f6865697260008201527f496e6865726974616e6365732e6c656e67746800000000000000000000000000602082015250565b600061486d6033836144dd565b915061487882614811565b604082019050919050565b6000602082019050818103600083015261489c81614860565b9050919050565b7f6457696c6c3a205769746864726177616c206973206e6f74207965742061766160008201527f696c61626c650000000000000000000000000000000000000000000000000000602082015250565b60006148ff6026836144dd565b915061490a826148a3565b604082019050919050565b6000602082019050818103600083015261492e816148f2565b9050919050565b7f6457696c6c3a2043616c6c6572206973206e6f74207468652068656972000000600082015250565b600061496b601d836144dd565b915061497682614935565b602082019050919050565b6000602082019050818103600083015261499a8161495e565b9050919050565b7f6457696c6c3a20416c72656164792077697468647261776e0000000000000000600082015250565b60006149d76018836144dd565b91506149e2826149a1565b602082019050919050565b60006020820190508181036000830152614a06816149ca565b9050919050565b6000614a1882613d19565b9150614a2383613d19565b9250828202614a3181613d19565b91508282048414831517614a4857614a476146a7565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614a8982613d19565b9150614a9483613d19565b925082614aa457614aa3614a4f565b5b828204905092915050565b6000606082019050614ac46000830186614349565b614ad16020830185613fed565b614ade6040830184613fed565b949350505050565b7f6457696c6c3a20546f6b656e2069732061646472657373283029000000000000600082015250565b6000614b1c601a836144dd565b9150614b2782614ae6565b602082019050919050565b60006020820190508181036000830152614b4b81614b0f565b9050919050565b7f6457696c6c3a20416d6f756e7420697320300000000000000000000000000000600082015250565b6000614b886012836144dd565b9150614b9382614b52565b602082019050919050565b60006020820190508181036000830152614bb781614b7b565b9050919050565b6000614bc982613d19565b9150614bd483613d19565b9250828201905080821115614bec57614beb6146a7565b5b92915050565b6000614bfd82613d19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614c2f57614c2e6146a7565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614c966026836144dd565b9150614ca182614c3a565b604082019050919050565b60006020820190508181036000830152614cc581614c89565b9050919050565b7f6457696c6c3a2043616c6c6572206973206e6f7420746865206f776e65720000600082015250565b6000614d02601e836144dd565b9150614d0d82614ccc565b602082019050919050565b60006020820190508181036000830152614d3181614cf5565b9050919050565b6000606082019050614d4d6000830186614116565b614d5a6020830185614116565b614d676040830184613fed565b949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614da56020836144dd565b9150614db082614d6f565b602082019050919050565b60006020820190508181036000830152614dd481614d98565b9050919050565b7f6457696c6c3a20466565206d757374206265206c6f776572206f72206571756160008201527f6c20352500000000000000000000000000000000000000000000000000000000602082015250565b6000614e376024836144dd565b9150614e4282614ddb565b604082019050919050565b60006020820190508181036000830152614e6681614e2a565b9050919050565b7f6457696c6c3a2043616e27742073657420666565436f6c6c6563746f7220746f60008201527f2061646472657373283029000000000000000000000000000000000000000000602082015250565b6000614ec9602b836144dd565b9150614ed482614e6d565b604082019050919050565b60006020820190508181036000830152614ef881614ebc565b9050919050565b614f0881613eea565b8114614f1357600080fd5b50565b600081519050614f2581614eff565b92915050565b600060208284031215614f4157614f40613d0f565b5b6000614f4f84828501614f16565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614fb4602a836144dd565b9150614fbf82614f58565b604082019050919050565b60006020820190508181036000830152614fe381614fa7565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006150466026836144dd565b915061505182614fea565b604082019050919050565b6000602082019050818103600083015261507581615039565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006150b2601d836144dd565b91506150bd8261507c565b602082019050919050565b600060208201905081810360008301526150e1816150a5565b9050919050565b600081519050919050565b600081905092915050565b60005b8381101561511c578082015181840152602081019050615101565b60008484015250505050565b6000615133826150e8565b61513d81856150f3565b935061514d8185602086016150fe565b80840191505092915050565b60006151658284615128565b915081905092915050565b600081519050919050565b600061518682615170565b61519081856144dd565b93506151a08185602086016150fe565b6151a981614145565b840191505092915050565b600060208201905081810360008301526151ce818461517b565b90509291505056fea2646970667358221220233a27c66263b635449027d1a2bee168ddeb5920fb688e8dc665747c2f7a59b264736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e8d562606f35cb14da3e8fab1174f9b5ae8319c4000000000000000000000000000000000000000000000000006a94d74f430000
-----Decoded View---------------
Arg [0] : _feeCollector (address): 0xE8D562606F35CB14dA3E8faB1174F9B5AE8319c4
Arg [1] : _fee (uint256): 30000000000000000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e8d562606f35cb14da3e8fab1174f9b5ae8319c4
Arg [1] : 000000000000000000000000000000000000000000000000006a94d74f430000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.