{"file_path":"src/VaultV2Supervisor.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: UNLICENSED\npragma solidity 0.8.28;\n\nimport {IVaultV2} from \"vault-v2/src/interfaces/IVaultV2.sol\";\nimport {EnumerableSet} from \"openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol\";\n\ninterface IRevokable {\n    function revoke(bytes calldata data) external;\n}\n\ninterface ISkimRecipient {\n    function setSkimRecipient(address newSkimRecipient) external;\n}\n\n/// @title VaultV2Supervisor\n/// @author Steakhouse Financial\n/// @notice Act as improved owner for Vault V2 instances with timelocked owner actions and guardian vetoes.\n/// @dev The supervisor is intended to own one or more Vault V2 contracts.\ncontract VaultV2Supervisor {\n    using EnumerableSet for EnumerableSet.AddressSet;\n\n    /// @dev Caller is not the supervisor owner.\n    error NotOwner();\n    /// @dev Provided address is zero.\n    error ZeroAddress();\n    /// @dev Caller is not a registered guardian for the vault.\n    error NotGuardian();\n    /// @dev Timelock has not expired yet.\n    error TimelockNotExpired();\n    /// @dev Caller is neither the supervisor owner nor the vault owner.\n    error OnlyOwnerOrVaultOwner();\n    /// @dev Timelock data is already scheduled.\n    error DataAlreadyTimelocked();\n    /// @dev Timelock data is not scheduled.\n    error DataNotTimelocked();\n    /// @dev Caller is neither the supervisor owner nor a guardian.\n    error OnlyOwnerOrGuardian();\n    /// @dev Calldata length is invalid.\n    error InvalidAmount();\n    /// @dev Selector is not supported for supervisor timelock submission.\n    error UnsupportedSelector();\n    /// @dev Provided timelock duration is invalid.\n    error InvalidTimelock();\n    /// @dev An ownership change is already scheduled.\n    error OwnershipChangeAlreadyScheduled();\n    /// @dev Operation would not change state.\n    error NoOp();\n    /// @dev Caller is not the pending supervisor owner.\n    error NotPendingSupervisorOwner();\n    /// @dev Sentinel removal attempted for the supervisor address.\n    error CannotRemoveSupervisorSentinel();\n\n    /// @notice Emitted when the supervisor owner changes.\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n    /// @notice Emitted when a new supervisor owner is proposed.\n    event OwnershipTransferStarted(address indexed previousOwner, address indexed pendingOwner);\n    /// @notice Emitted when a vault owner is allowlisted or removed.\n    event AllowedVaultOwnerSet(address indexed vaultOwner, bool allowed);\n    /// @notice Emitted when a timelocked action is submitted.\n    event TimelockSubmitted(\n        address indexed sender, address indexed vault, bytes4 indexed selector, bytes data, uint256 executeAfter\n    );\n    /// @notice Emitted when a timelocked action is revoked.\n    event TimelockRevoked(address indexed sender, address indexed vault, bytes4 indexed selector, bytes data);\n    /// @notice Emitted when a guardian is added for a vault.\n    event GuardianAdded(address indexed vault, address indexed guardian, address indexed sender);\n    /// @notice Emitted when a guardian is removed for a vault.\n    event GuardianRemoved(address indexed vault, address indexed guardian, address indexed sender);\n    /// @notice Emitted when a vault-level revoke is forwarded.\n    event VaultRevokeForwarded(address indexed sender, address indexed vault, bytes4 indexed selector, bytes data);\n\n    /// @notice Address of the supervisor owner.\n    address public owner;\n    /// @notice Proposed supervisor owner waiting to accept ownership.\n    address public pendingSupervisorOwner;\n    /// @notice Timelock duration for sensitive actions, in seconds.\n    uint256 public immutable TIMELOCK;\n    /// @notice Execution timestamp for scheduled calldata.\n    /// @dev Keyed by the exact calldata of the action.\n    mapping(bytes data => uint256) public executableAt;\n    /// @notice Map listing the vaults for which a new owner is submitted but not executed, if any\n    mapping(address vault => address) public scheduledNewOwner;\n    /// @notice Allowlist for vault owners that may add guardians for their vaults.\n    mapping(address vaultOwner => bool) public allowedVaultOwners;\n    /// @dev Set of vaults with at least one registered guardian.\n    EnumerableSet.AddressSet private _vaults;\n    /// @dev Per-vault guardian set.\n    mapping(address vault => EnumerableSet.AddressSet) private _guardians;\n\n    /// @dev Restricts execution to the supervisor owner.\n    modifier onlyOwner() {\n        require(msg.sender == owner, NotOwner());\n        _;\n    }\n\n    /// @dev Restricts execution to a guardian registered for the vault.\n    modifier onlyGuardian(address vault) {\n        require(_guardians[vault].contains(msg.sender), NotGuardian());\n        _;\n    }\n\n    /// @dev Restricts execution to the supervisor owner or a guardian registered for the vault.\n    modifier onlyOwnerOrGuardian(address vault) {\n        _checkOwnerOrGuardian(vault);\n        _;\n    }\n\n    /// @notice Initializes the supervisor owner and timelock.\n    /// @param timelock_ Timelock duration for sensitive actions, in seconds.\n    constructor(uint256 timelock_) {\n        require(timelock_ > 0, InvalidTimelock());\n        owner = msg.sender;\n        emit OwnershipTransferred(address(0), msg.sender);\n        TIMELOCK = timelock_;\n    }\n\n    /// @notice Starts a two-step transfer of supervisor ownership.\n    /// @param newOwner The proposed new owner address. Set to zero to cancel a pending transfer.\n    function transferSupervisorOwnership(address newOwner) external onlyOwner {\n        require(newOwner != owner, NoOp());\n        require(newOwner != pendingSupervisorOwner, NoOp());\n\n        pendingSupervisorOwner = newOwner;\n        emit OwnershipTransferStarted(owner, newOwner);\n    }\n\n    /// @notice Accepts supervisor ownership as the pending owner.\n    function acceptSupervisorOwnership() external {\n        require(msg.sender == pendingSupervisorOwner, NotPendingSupervisorOwner());\n\n        address previous = owner;\n        owner = msg.sender;\n        pendingSupervisorOwner = address(0);\n        emit OwnershipTransferred(previous, msg.sender);\n    }\n\n    /// @notice Schedules a timelocked action.\n    /// @param data Full calldata of the action to execute later.\n    function submit(bytes calldata data) external onlyOwner {\n        require(executableAt[data] == 0, DataAlreadyTimelocked());\n        require(data.length >= 4, InvalidAmount());\n\n        bytes4 selector = _selector(data);\n        require(_selectorUsesVault(selector), UnsupportedSelector());\n        address vault = _extractVaultAddress(selector, data);\n        uint256 executeAfter = block.timestamp + TIMELOCK;\n\n        if (selector == this.setOwner.selector) {\n            (address vaultAddress, address newOwner) = _decodeCanonicalTwoAddressCalldata(selector, data);\n            require(vaultAddress != address(0) && newOwner != address(0), ZeroAddress());\n            require(newOwner != IVaultV2(vaultAddress).owner(), NoOp());\n            require(scheduledNewOwner[vaultAddress] == address(0), OwnershipChangeAlreadyScheduled());\n            scheduledNewOwner[vaultAddress] = newOwner;\n        } else if (selector == this.removeGuardian.selector) {\n            _decodeCanonicalTwoAddressCalldata(selector, data);\n        }\n\n        executableAt[data] = executeAfter;\n        emit TimelockSubmitted(msg.sender, vault, selector, data, executeAfter);\n    }\n\n    /// @notice Cancels a pending timelocked action.\n    /// @param data Full calldata that was previously submitted.\n    function revoke(bytes calldata data) external {\n        bytes4 selector = _selector(data);\n        address vault = _extractVaultAddress(selector, data);\n        _checkOwnerOrGuardian(vault);\n        _revokeKnownVault(data, vault, selector);\n    }\n\n    /// @notice Cancels a pending guardian removal timelock.\n    /// @param vault The vault whose guardian removal was submitted.\n    /// @param guardian The guardian address being removed.\n    function revokeGuardianRemoval(IVaultV2 vault, address guardian) external onlyOwnerOrGuardian(address(vault)) {\n        address vaultAddress = address(vault);\n        bytes memory data = abi.encodeWithSelector(VaultV2Supervisor.removeGuardian.selector, vault, guardian);\n        _revokeKnownVault(data, vaultAddress, VaultV2Supervisor.removeGuardian.selector);\n    }\n\n    /// @notice Cancels a pending vault ownership transfer timelock.\n    /// @param vault The vault whose ownership transfer was submitted.\n    function revokeVaultOwnerChange(IVaultV2 vault) external onlyOwnerOrGuardian(address(vault)) {\n        address vaultAddress = address(vault);\n        bytes memory data =\n            abi.encodeWithSelector(VaultV2Supervisor.setOwner.selector, vault, scheduledNewOwner[vaultAddress]);\n        _revokeKnownVault(data, vaultAddress, VaultV2Supervisor.setOwner.selector);\n    }\n\n    /// @notice Sets the curator on a vault (no timelock).\n    /// @param vault The vault to update.\n    /// @param newCurator The new curator address.\n    function setCurator(IVaultV2 vault, address newCurator) external onlyOwner {\n        require(vault.curator() != newCurator, NoOp());\n        vault.setCurator(newCurator);\n    }\n\n    /// @notice Sets the name on a vault (no timelock).\n    /// @param vault The vault to update.\n    /// @param newName The new name.\n    function setName(IVaultV2 vault, string calldata newName) external onlyOwner {\n        require(keccak256(bytes(vault.name())) != keccak256(bytes(newName)), NoOp());\n        vault.setName(newName);\n    }\n\n    /// @notice Sets the symbol on a vault (no timelock).\n    /// @param vault The vault to update.\n    /// @param newSymbol The new symbol.\n    function setSymbol(IVaultV2 vault, string calldata newSymbol) external onlyOwner {\n        require(keccak256(bytes(vault.symbol())) != keccak256(bytes(newSymbol)), NoOp());\n        vault.setSymbol(newSymbol);\n    }\n\n    /// @notice Sets the skim recipient on a vault adapter (no timelock).\n    /// @param skimable The adapter to update.\n    /// @param newSkimRecipient The new skim recipient address.\n    function setSkimRecipient(address skimable, address newSkimRecipient) external onlyOwner {\n        ISkimRecipient(skimable).setSkimRecipient(newSkimRecipient);\n    }\n\n    /// @notice Adds a sentinel on a vault (no timelock).\n    /// @param vault The vault to update.\n    /// @param account The sentinel address to add.\n    function addSentinel(IVaultV2 vault, address account) external onlyOwner {\n        vault.setIsSentinel(account, true);\n    }\n\n    /// @notice Allowlists or removes a vault owner for guardian self-management.\n    /// @param vaultOwner The vault owner address.\n    /// @param allowed Whether the owner is allowed to add guardians for its vaults.\n    function setAllowedVaultOwner(address vaultOwner, bool allowed) external onlyOwner {\n        require(vaultOwner != address(0), ZeroAddress());\n        require(allowedVaultOwners[vaultOwner] != allowed, NoOp());\n        allowedVaultOwners[vaultOwner] = allowed;\n        emit AllowedVaultOwnerSet(vaultOwner, allowed);\n    }\n\n    /// @notice Adds a guardian for a vault.\n    /// @param vault The vault to add the guardian for.\n    /// @param guardian The guardian address to add.\n    /// @dev Vault owners can call only if allowlisted; the supervisor owner can always call.\n    function addGuardian(address vault, address guardian) external {\n        require(vault != address(0) && guardian != address(0), ZeroAddress());\n\n        address vaultOwner = IVaultV2(vault).owner();\n        require(\n            msg.sender == owner || (msg.sender == vaultOwner && allowedVaultOwners[vaultOwner]), OnlyOwnerOrVaultOwner()\n        );\n\n        require(_guardians[vault].add(guardian), NoOp());\n        _vaults.add(vault);\n        emit GuardianAdded(vault, guardian, msg.sender);\n    }\n\n    /// @notice Transfers vault ownership after the timelock.\n    /// @param vault The vault to update.\n    /// @param newOwner The new owner address.\n    function setOwner(IVaultV2 vault, address newOwner) external onlyOwner {\n        timelocked();\n        require(vault.owner() != newOwner, NoOp());\n        scheduledNewOwner[address(vault)] = address(0);\n        vault.setOwner(newOwner);\n    }\n\n    /// @notice Removes a sentinel from a vault.\n    /// @param vault The vault to update.\n    /// @param sentinel The sentinel address to remove.\n    function removeSentinel(IVaultV2 vault, address sentinel) external onlyOwner {\n        require(sentinel != address(this), CannotRemoveSupervisorSentinel());\n        vault.setIsSentinel(sentinel, false);\n    }\n\n    /// @notice Removes a guardian from a vault after the timelock.\n    /// @param vault The vault to update.\n    /// @param guardian The guardian address to remove.\n    function removeGuardian(IVaultV2 vault, address guardian) external onlyOwner {\n        timelocked();\n        address vaultAddress = address(vault);\n\n        require(_guardians[vaultAddress].remove(guardian), NoOp());\n\n        if (_guardians[vaultAddress].length() == 0) {\n            _vaults.remove(vaultAddress);\n        }\n\n        emit GuardianRemoved(vaultAddress, guardian, msg.sender);\n    }\n\n    /// @notice Forwards a revoke to the vault's timelock.\n    /// @param vault The vault to target.\n    /// @param data The vault calldata to revoke.\n    function revoke(address vault, bytes calldata data) external onlyGuardian(vault) {\n        IRevokable(vault).revoke(data);\n        emit VaultRevokeForwarded(msg.sender, vault, _selector(data), data);\n    }\n\n    /// @notice Sets the supervisor contract as a sentinel on a vault (permissionless).\n    /// @param vault The vault to update.\n    /// @dev This makes sure the supervisor can revoke submitted operations on behalf of the guardians.\n    /// @dev For a `Box` contract, the curator should add the supervisor as guardian manually.\n    function setSupervisorAsSentinel(IVaultV2 vault) external {\n        require(!vault.isSentinel(address(this)), NoOp());\n        vault.setIsSentinel(address(this), true);\n    }\n\n    /// @notice Returns vaults with at least one registered guardian.\n    function getVaults() external view returns (address[] memory) {\n        return _vaults.values();\n    }\n\n    /// @notice Returns tracked vaults currently owned by this supervisor.\n    function getOwnedVaults() external view returns (address[] memory ownedVaults) {\n        ownedVaults = _filterVaultsByOwnership(true);\n    }\n\n    /// @notice Returns tracked vaults not currently owned by this supervisor.\n    function getNonOwnedVaults() external view returns (address[] memory nonOwnedVaults) {\n        nonOwnedVaults = _filterVaultsByOwnership(false);\n    }\n\n    /// @notice Returns the guardians registered for a vault.\n    /// @param vault The vault to query.\n    function getGuardians(address vault) external view returns (address[] memory) {\n        return _guardians[vault].values();\n    }\n\n    /// @notice Returns whether a vault ownership transfer is currently scheduled.\n    /// @param vault The vault to query.\n    function isOwnershipChanging(address vault) external view returns (bool) {\n        return scheduledNewOwner[vault] != address(0);\n    }\n\n    /// @notice Returns whether guardian removal is currently scheduled.\n    /// @param vault The vault to query.\n    /// @param guardian The guardian to query.\n    function isGuardianBeingRemoved(address vault, address guardian) external view returns (bool) {\n        bytes memory data = abi.encodeWithSelector(VaultV2Supervisor.removeGuardian.selector, vault, guardian);\n        return executableAt[data] > 0;\n    }\n\n    /// @notice Returns whether a vault-like contract is currently supervised by this contract.\n    /// @param vault The vault address to query.\n    function isVaultSupervised(address vault) external view returns (bool) {\n        return _ownerOf(vault) == address(this);\n    }\n\n    /// @dev Internal revoke routine when the vault and selector are known.\n    function _revokeKnownVault(bytes memory data, address vault, bytes4 selector) internal {\n        require(executableAt[data] != 0, DataNotTimelocked());\n\n        if (selector == this.setOwner.selector) {\n            scheduledNewOwner[vault] = address(0);\n        }\n\n        executableAt[data] = 0;\n        emit TimelockRevoked(msg.sender, vault, selector, data);\n    }\n\n    /// @dev Validates and consumes the timelock for the current calldata.\n    function timelocked() internal {\n        uint256 eta = executableAt[msg.data];\n        require(eta != 0, DataNotTimelocked());\n        require(block.timestamp >= eta, TimelockNotExpired());\n        executableAt[msg.data] = 0;\n    }\n\n    /// @dev Validates that caller is the supervisor owner or a guardian for the vault.\n    function _checkOwnerOrGuardian(address vault) internal view {\n        require(_guardians[vault].contains(msg.sender) || msg.sender == owner, OnlyOwnerOrGuardian());\n    }\n\n    /// @dev Returns tracked vaults filtered by ownership status.\n    function _filterVaultsByOwnership(bool ownedBySupervisor) internal view returns (address[] memory vaults_) {\n        uint256 length = _vaults.length();\n        vaults_ = new address[](length);\n        uint256 count;\n\n        for (uint256 i; i < length; ++i) {\n            address vault = _vaults.at(i);\n            bool isOwned = _ownerOf(vault) == address(this);\n            if (isOwned == ownedBySupervisor) {\n                vaults_[count] = vault;\n                ++count;\n            }\n        }\n\n        assembly {\n            mstore(vaults_, count)\n        }\n    }\n\n    /// @dev Extracts the vault address from a supervisor calldata payload.\n    /// @dev Returns address(0) for selectors that do not target a vault.\n    /// @param selector Function selector parsed from data.\n    /// @param data Full calldata (selector + ABI args) for a supervisor action.\n    /// @return v The decoded vault address, or address(0) if data is too short.\n    function _extractVaultAddress(bytes4 selector, bytes calldata data) internal pure returns (address v) {\n        if (!_selectorUsesVault(selector)) return address(0);\n        if (data.length < 36) return address(0);\n        assembly {\n            v := and(calldataload(add(data.offset, 4)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n    }\n\n    /// @dev Decodes two address arguments and enforces canonical ABI encoding (no trailing or dirty bytes).\n    function _decodeCanonicalTwoAddressCalldata(bytes4 selector, bytes calldata data)\n        internal\n        pure\n        returns (address first, address second)\n    {\n        require(data.length == 68, InvalidAmount());\n        assembly {\n            first := and(calldataload(add(data.offset, 4)), 0xffffffffffffffffffffffffffffffffffffffff)\n            second := and(calldataload(add(data.offset, 36)), 0xffffffffffffffffffffffffffffffffffffffff)\n        }\n        bytes memory canonical = abi.encodeWithSelector(selector, first, second);\n        require(keccak256(data) == keccak256(canonical), InvalidAmount());\n    }\n\n    function _selector(bytes calldata data) internal pure returns (bytes4 selector) {\n        if (data.length < 4) return bytes4(0);\n        assembly {\n            selector := calldataload(data.offset)\n        }\n    }\n\n    /// @dev Returns whether a selector encodes a vault as first argument.\n    function _selectorUsesVault(bytes4 selector) internal pure returns (bool) {\n        return selector == this.setOwner.selector || selector == this.removeGuardian.selector;\n    }\n\n    function _ownerOf(address vault) internal view returns (address owner_) {\n        (bool success, bytes memory returnData) = vault.staticcall(abi.encodeWithSelector(IVaultV2.owner.selector));\n        if (!success || returnData.length < 32) return address(0);\n        owner_ = abi.decode(returnData, (address));\n    }\n}\n","deployed_bytecode":"0x608060405234801561000f575f5ffd5b50600436106101e3575f3560e01c806385e2e5311161010d578063bbccd45b116100a0578063e3f476811161006f578063e3f476811461054d578063ef7fa71b14610569578063f18858ab14610585578063f9559f76146105b5576101e3565b8063bbccd45b146104b5578063c6845210146104e5578063cff3358014610501578063e1d936f814610531576101e3565b80638da5cb5b116100dc5780638da5cb5b146104415780639a9738441461045f5780639b27a90e1461047b578063a8dd2c6d14610497576101e3565b806385e2e531146103a95780638639fb07146103d957806388c5fbc8146104095780638ae54c4a14610425576101e3565b8063363b3c15116101855780635a5de927116101545780635a5de927146103215780637aadef8b1461033d578063829e13a31461035b578063843d1c671461038b576101e3565b8063363b3c15146102ad57806344d00f82146102c957806348a54849146102e75780635836317f14610305576101e3565b80630fb90d1a116101c15780630fb90d1a1461024f57806326f438c51461026b578063299a7bcc146102755780633121db1c14610291576101e3565b806309f46839146101e75780630b467b9b146102175780630d1840ea14610233575b5f5ffd5b61020160048036038101906101fc9190613422565b6105d1565b60405161020e9190613467565b60405180910390f35b610231600480360381019061022c91906134e1565b6105ee565b005b61024d60048036038101906102489190613567565b610666565b005b61026960048036038101906102649190613592565b610763565b005b6102736108b9565b005b61028f600480360381019061028a9190613592565b610a3f565b005b6102ab60048036038101906102a69190613625565b610c81565b005b6102c760048036038101906102c29190613422565b610e38565b005b6102d1611083565b6040516102de9190613739565b60405180910390f35b6102ef611094565b6040516102fc9190613739565b60405180910390f35b61031f600480360381019061031a9190613783565b6110a5565b005b61033b600480360381019061033691906137c1565b6112ba565b005b6103456113a9565b6040516103529190613817565b60405180910390f35b610375600480360381019061037091906137c1565b6113cd565b6040516103829190613467565b60405180910390f35b610393611473565b6040516103a0919061383f565b60405180910390f35b6103c360048036038101906103be9190613422565b611498565b6040516103d09190613467565b60405180910390f35b6103f360048036038101906103ee9190613990565b61152c565b6040516104009190613817565b60405180910390f35b610423600480360381019061041e9190613592565b611559565b005b61043f600480360381019061043a9190613592565b61164b565b005b6104496116ed565b604051610456919061383f565b60405180910390f35b610479600480360381019061047491906139d7565b611711565b005b61049560048036038101906104909190613592565b611895565b005b61049f611a81565b6040516104ac9190613739565b60405180910390f35b6104cf60048036038101906104ca9190613422565b611a91565b6040516104dc919061383f565b60405180910390f35b6104ff60048036038101906104fa91906137c1565b611ac1565b005b61051b60048036038101906105169190613422565b611deb565b6040516105289190613467565b60405180910390f35b61054b60048036038101906105469190613625565b611e2a565b005b61056760048036038101906105629190613567565b611fe1565b005b610583600480360381019061057e91906134e1565b6120fb565b005b61059f600480360381019061059a9190613422565b6126be565b6040516105ac9190613739565b60405180910390f35b6105cf60048036038101906105ca9190613592565b61270c565b005b6004602052805f5260405f205f915054906101000a900460ff1681565b5f6105f983836128cb565b90505f6106078285856128ee565b90506106128161293d565b61066084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508284612a1b565b50505050565b806106708161293d565b5f8290505f63299a7bcc60e01b8460035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516024016106ec929190613a8f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905061075d818363299a7bcc60e01b612a1b565b50505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107e8576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361084d576040517f0cdbb77000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663920ed706825f6040518363ffffffff1660e01b8152600401610888929190613ab6565b5f604051808303815f87803b15801561089f575f5ffd5b505af11580156108b1573d5f5f3e3d5ffd5b505050505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461093f576040517f11cc639800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610acc612be7565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b509190613af1565b73ffffffffffffffffffffffffffffffffffffffff1603610b9c576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff166313af4035826040518263ffffffff1660e01b8152600401610c50919061383f565b5f604051808303815f87803b158015610c67575f5ffd5b505af1158015610c79573d5f5f3e3d5ffd5b505050505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d06576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181604051610d16929190613b4a565b60405180910390208373ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015610d66573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610d8e9190613c0e565b8051906020012003610dcb576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663c47f002783836040518363ffffffff1660e01b8152600401610e06929190613c91565b5f604051808303815f87803b158015610e1d575f5ffd5b505af1158015610e2f573d5f5f3e3d5ffd5b50505050505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ebd576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f41576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fc6576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b606061108f6005612ca6565b905090565b60606110a06001612cc5565b905090565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461112a576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361118f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611214576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f7ddfe1f63a92a8ccb04d4109064330f2fd92d60fb9ea99d7f276a9da94b0a7cb826040516112ae9190613467565b60405180910390a25050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461133f576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16632b30997b826040518263ffffffff1660e01b8152600401611378919061383f565b5f604051808303815f87803b15801561138f575f5ffd5b505af11580156113a1573d5f5f3e3d5ffd5b505050505050565b7f000000000000000000000000000000000000000000000000000000000012750081565b5f5f639b27a90e60e01b84846040516024016113ea929190613cb3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090505f60028260405161145a9190613d14565b9081526020016040518091039020541191505092915050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f73ffffffffffffffffffffffffffffffffffffffff1660035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6002818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115de576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663920ed7068260016040518363ffffffff1660e01b815260040161161a929190613ab6565b5f604051808303815f87803b158015611631575f5ffd5b505af1158015611643573d5f5f3e3d5ffd5b505050505050565b816116558161293d565b5f8390505f639b27a90e60e01b8585604051602401611675929190613a8f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506116e68183639b27a90e60e01b612a1b565b5050505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b826117613360075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612df990919063ffffffff16565b611797576040517fef6d0f0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16630b467b9b84846040518363ffffffff1660e01b81526004016117d2929190613d66565b5f604051808303815f87803b1580156117e9575f5ffd5b505af11580156117fb573d5f5f3e3d5ffd5b5050505061180983836128cb565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167faea2cba5da94dcdf29f38e34d350097037fe8f5be24caac01e19513b972dd1ea8686604051611887929190613d66565b60405180910390a450505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461191a576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611922612be7565b5f8290506119758260075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612e2690919063ffffffff16565b6119aa576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6119f060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612e53565b03611a0b57611a09816005612e2690919063ffffffff16565b505b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f5d17989a4aeeda75e413fe31d9ae4731017b8b4f094d35a492fd217d00e0807c60405160405180910390a4505050565b6060611a8c5f612cc5565b905090565b6003602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611b2957505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611b5f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ba9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bcd9190613af1565b90505f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ca657508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148015611ca5575060045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b5b611cdc576040517fa354ff9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d2b8260075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612e6690919063ffffffff16565b611d60576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d74836005612e6690919063ffffffff16565b503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f42b94b097bf6b2d4d69d9c26a2ef138effda16b3d46c66a9ad78031af4c4185f60405160405180910390a4505050565b5f3073ffffffffffffffffffffffffffffffffffffffff16611e0c83612e93565b73ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eaf576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181604051611ebf929190613b4a565b60405180910390208373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015611f0f573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611f379190613c0e565b8051906020012003611f74576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663b84c824683836040518363ffffffff1660e01b8152600401611faf929190613c91565b5f604051808303815f87803b158015611fc6575f5ffd5b505af1158015611fd8573d5f5f3e3d5ffd5b50505050505050565b8073ffffffffffffffffffffffffffffffffffffffff1663ba03a75f306040518263ffffffff1660e01b815260040161201a919061383f565b602060405180830381865afa158015612035573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120599190613d9c565b1561208f576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663920ed7063060016040518363ffffffff1660e01b81526004016120cb929190613ab6565b5f604051808303815f87803b1580156120e2575f5ffd5b505af11580156120f4573d5f5f3e3d5ffd5b5050505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612180576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60028383604051612193929190613b4a565b908152602001604051809103902054146121d9576040517f9b42992500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004828290501015612217576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61222283836128cb565b905061222d81612fa2565b612263576040517f1e8b844100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61226f8285856128ee565b90505f7f00000000000000000000000000000000000000000000000000000000001275004261229e9190613df4565b905063299a7bcc60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036125ae575f5f6122f9858888613041565b915091505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561236557505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61239b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124089190613af1565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361246b576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461252c576040517f39fd2fa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050612609565b639b27a90e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361260857612605838686613041565b50505b5b806002868660405161261c929190613b4a565b908152602001604051809103902081905550827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd8715a4596f2c33a2e65b4e88319978c3212391c814a704ef2237368cf601be98888866040516126af93929190613e27565b60405180910390a45050505050565b606061270560075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612ca6565b9050919050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612791576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663e66f53b76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127f1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128159190613af1565b73ffffffffffffffffffffffffffffffffffffffff1603612861576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663e90956cf826040518263ffffffff1660e01b815260040161289a919061383f565b5f604051808303815f87803b1580156128b1575f5ffd5b505af11580156128c3573d5f5f3e3d5ffd5b505050505050565b5f60048383905010156128e3575f60e01b90506128e8565b823590505b92915050565b5f6128f884612fa2565b612904575f9050612936565b6024838390501015612918575f9050612936565b73ffffffffffffffffffffffffffffffffffffffff60048401351690505b9392505050565b61298c3360075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612df990919063ffffffff16565b806129e257505f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612a18576040517fe0697a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f600284604051612a2c9190613d14565b90815260200160405180910390205403612a72576040517f1ea942a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63299a7bcc60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603612b3a575f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5f600284604051612b4b9190613d14565b908152602001604051809103902081905550807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f694a877f120341826111772ddbeeffe7bd01128eb7cdfa63b6dbdb0b95c8632d86604051612bda9190613e8f565b60405180910390a4505050565b5f60025f36604051612bfa929190613b4a565b90815260200160405180910390205490505f8103612c44576040517f1ea942a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80421015612c7e576040517f621e25c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60025f36604051612c91929190613b4a565b90815260200160405180910390208190555050565b60605f612cb4835f0161318e565b905060608190508092505050919050565b60605f612cd26005612e53565b90508067ffffffffffffffff811115612cee57612ced61386c565b5b604051908082528060200260200182016040528015612d1c5781602001602082028036833780820191505090505b5091505f5f5b82811015612dee575f612d3f8260056131e790919063ffffffff16565b90505f3073ffffffffffffffffffffffffffffffffffffffff16612d6283612e93565b73ffffffffffffffffffffffffffffffffffffffff1614905086151581151503612de15781868581518110612d9a57612d99613eaf565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083612dde90613edc565b93505b5050806001019050612d22565b508083525050919050565b5f612e1e835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6131fe565b905092915050565b5f612e4b835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61321e565b905092915050565b5f612e5f825f0161331a565b9050919050565b5f612e8b835f018373ffffffffffffffffffffffffffffffffffffffff165f1b613329565b905092915050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff16638da5cb5b60e01b604051602401604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612f259190613d14565b5f60405180830381855afa9150503d805f8114612f5d576040519150601f19603f3d011682016040523d82523d5f602084013e612f62565b606091505b5091509150811580612f75575060208151105b15612f84575f92505050612f9d565b80806020019051810190612f989190613f5e565b925050505b919050565b5f63299a7bcc60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061303a5750639b27a90e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f5f60448484905014613080576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff600485013516915073ffffffffffffffffffffffffffffffffffffffff60248501351690505f8583836040516024016130cf929190613cb3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905080805190602001208585604051613146929190613b4a565b604051809103902014613185576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50935093915050565b6060815f018054806020026020016040519081016040528092919081815260200182805480156131db57602002820191905f5260205f20905b8154815260200190600101908083116131c7575b50505050509050919050565b5f6131f4835f0183613390565b5f1c905092915050565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f5f836001015f8481526020019081526020015f205490505f811461330f575f60018261324b9190613f89565b90505f6001865f01805490506132619190613f89565b90508082146132c7575f865f0182815481106132805761327f613eaf565b5b905f5260205f200154905080875f0184815481106132a1576132a0613eaf565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f018054806132da576132d9613fbc565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050613314565b5f9150505b92915050565b5f815f01805490509050919050565b5f61333483836131fe565b61338657825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f20819055506001905061338a565b5f90505b92915050565b5f825f0182815481106133a6576133a5613eaf565b5b905f5260205f200154905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6133f1826133c8565b9050919050565b613401816133e7565b811461340b575f5ffd5b50565b5f8135905061341c816133f8565b92915050565b5f60208284031215613437576134366133c0565b5b5f6134448482850161340e565b91505092915050565b5f8115159050919050565b6134618161344d565b82525050565b5f60208201905061347a5f830184613458565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126134a1576134a0613480565b5b8235905067ffffffffffffffff8111156134be576134bd613484565b5b6020830191508360018202830111156134da576134d9613488565b5b9250929050565b5f5f602083850312156134f7576134f66133c0565b5b5f83013567ffffffffffffffff811115613514576135136133c4565b5b6135208582860161348c565b92509250509250929050565b5f613536826133e7565b9050919050565b6135468161352c565b8114613550575f5ffd5b50565b5f813590506135618161353d565b92915050565b5f6020828403121561357c5761357b6133c0565b5b5f61358984828501613553565b91505092915050565b5f5f604083850312156135a8576135a76133c0565b5b5f6135b585828601613553565b92505060206135c68582860161340e565b9150509250929050565b5f5f83601f8401126135e5576135e4613480565b5b8235905067ffffffffffffffff81111561360257613601613484565b5b60208301915083600182028301111561361e5761361d613488565b5b9250929050565b5f5f5f6040848603121561363c5761363b6133c0565b5b5f61364986828701613553565b935050602084013567ffffffffffffffff81111561366a576136696133c4565b5b613676868287016135d0565b92509250509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6136b4816133e7565b82525050565b5f6136c583836136ab565b60208301905092915050565b5f602082019050919050565b5f6136e782613682565b6136f1818561368c565b93506136fc8361369c565b805f5b8381101561372c57815161371388826136ba565b975061371e836136d1565b9250506001810190506136ff565b5085935050505092915050565b5f6020820190508181035f83015261375181846136dd565b905092915050565b6137628161344d565b811461376c575f5ffd5b50565b5f8135905061377d81613759565b92915050565b5f5f60408385031215613799576137986133c0565b5b5f6137a68582860161340e565b92505060206137b78582860161376f565b9150509250929050565b5f5f604083850312156137d7576137d66133c0565b5b5f6137e48582860161340e565b92505060206137f58582860161340e565b9150509250929050565b5f819050919050565b613811816137ff565b82525050565b5f60208201905061382a5f830184613808565b92915050565b613839816133e7565b82525050565b5f6020820190506138525f830184613830565b92915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6138a28261385c565b810181811067ffffffffffffffff821117156138c1576138c061386c565b5b80604052505050565b5f6138d36133b7565b90506138df8282613899565b919050565b5f67ffffffffffffffff8211156138fe576138fd61386c565b5b6139078261385c565b9050602081019050919050565b828183375f83830152505050565b5f61393461392f846138e4565b6138ca565b9050828152602081018484840111156139505761394f613858565b5b61395b848285613914565b509392505050565b5f82601f83011261397757613976613480565b5b8135613987848260208601613922565b91505092915050565b5f602082840312156139a5576139a46133c0565b5b5f82013567ffffffffffffffff8111156139c2576139c16133c4565b5b6139ce84828501613963565b91505092915050565b5f5f5f604084860312156139ee576139ed6133c0565b5b5f6139fb8682870161340e565b935050602084013567ffffffffffffffff811115613a1c57613a1b6133c4565b5b613a288682870161348c565b92509250509250925092565b5f819050919050565b5f613a57613a52613a4d846133c8565b613a34565b6133c8565b9050919050565b5f613a6882613a3d565b9050919050565b5f613a7982613a5e565b9050919050565b613a8981613a6f565b82525050565b5f604082019050613aa25f830185613a80565b613aaf6020830184613830565b9392505050565b5f604082019050613ac95f830185613830565b613ad66020830184613458565b9392505050565b5f81519050613aeb816133f8565b92915050565b5f60208284031215613b0657613b056133c0565b5b5f613b1384828501613add565b91505092915050565b5f81905092915050565b5f613b318385613b1c565b9350613b3e838584613914565b82840190509392505050565b5f613b56828486613b26565b91508190509392505050565b5f67ffffffffffffffff821115613b7c57613b7b61386c565b5b613b858261385c565b9050602081019050919050565b8281835e5f83830152505050565b5f613bb2613bad84613b62565b6138ca565b905082815260208101848484011115613bce57613bcd613858565b5b613bd9848285613b92565b509392505050565b5f82601f830112613bf557613bf4613480565b5b8151613c05848260208601613ba0565b91505092915050565b5f60208284031215613c2357613c226133c0565b5b5f82015167ffffffffffffffff811115613c4057613c3f6133c4565b5b613c4c84828501613be1565b91505092915050565b5f82825260208201905092915050565b5f613c708385613c55565b9350613c7d838584613914565b613c868361385c565b840190509392505050565b5f6020820190508181035f830152613caa818486613c65565b90509392505050565b5f604082019050613cc65f830185613830565b613cd36020830184613830565b9392505050565b5f81519050919050565b5f613cee82613cda565b613cf88185613b1c565b9350613d08818560208601613b92565b80840191505092915050565b5f613d1f8284613ce4565b915081905092915050565b5f82825260208201905092915050565b5f613d458385613d2a565b9350613d52838584613914565b613d5b8361385c565b840190509392505050565b5f6020820190508181035f830152613d7f818486613d3a565b90509392505050565b5f81519050613d9681613759565b92915050565b5f60208284031215613db157613db06133c0565b5b5f613dbe84828501613d88565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613dfe826137ff565b9150613e09836137ff565b9250828201905080821115613e2157613e20613dc7565b5b92915050565b5f6040820190508181035f830152613e40818587613d3a565b9050613e4f6020830184613808565b949350505050565b5f613e6182613cda565b613e6b8185613d2a565b9350613e7b818560208601613b92565b613e848161385c565b840191505092915050565b5f6020820190508181035f830152613ea78184613e57565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f613ee6826137ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f1857613f17613dc7565b5b600182019050919050565b5f613f2d826133c8565b9050919050565b613f3d81613f23565b8114613f47575f5ffd5b50565b5f81519050613f5881613f34565b92915050565b5f60208284031215613f7357613f726133c0565b5b5f613f8084828501613f4a565b91505092915050565b5f613f93826137ff565b9150613f9e836137ff565b9250828203905081811115613fb657613fb5613dc7565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220f1aed43836a4a54123a9c37ea8e7de6af4c4b223fc6f2fa69878f58e0a383b5c64736f6c634300081c0033","optimization_enabled":false,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"prague","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",":ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/",":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",":forge-std/=lib/forge-std/src/",":metamorpho/=lib/vault-v2/lib/metamorpho/src/",":openzeppelin-contracts/=lib/openzeppelin-contracts/",":vault-v2/=lib/vault-v2/"]},"optimization_runs":null,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/full_match/8453/0x639bfA26472906Ccd40513408284a8aD292bC5D6/","decoded_constructor_args":[["1209600",{"internalType":"uint256","name":"timelock_","type":"uint256"}]],"compiler_version":"0.8.28+commit.7893614a","is_verified_via_verifier_alliance":false,"verified_at":"2026-02-20T02:34:40.046464Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x60a060405234801561000f575f5ffd5b506040516141b13803806141b183398181016040528101906100319190610148565b5f811161006a576040517ff8d10e8200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806080818152505050610173565b5f5ffd5b5f819050919050565b61012781610115565b8114610131575f5ffd5b50565b5f815190506101428161011e565b92915050565b5f6020828403121561015d5761015c610111565b5b5f61016a84828501610134565b91505092915050565b60805161401f6101925f395f81816113ab0152612274015261401f5ff3fe608060405234801561000f575f5ffd5b50600436106101e3575f3560e01c806385e2e5311161010d578063bbccd45b116100a0578063e3f476811161006f578063e3f476811461054d578063ef7fa71b14610569578063f18858ab14610585578063f9559f76146105b5576101e3565b8063bbccd45b146104b5578063c6845210146104e5578063cff3358014610501578063e1d936f814610531576101e3565b80638da5cb5b116100dc5780638da5cb5b146104415780639a9738441461045f5780639b27a90e1461047b578063a8dd2c6d14610497576101e3565b806385e2e531146103a95780638639fb07146103d957806388c5fbc8146104095780638ae54c4a14610425576101e3565b8063363b3c15116101855780635a5de927116101545780635a5de927146103215780637aadef8b1461033d578063829e13a31461035b578063843d1c671461038b576101e3565b8063363b3c15146102ad57806344d00f82146102c957806348a54849146102e75780635836317f14610305576101e3565b80630fb90d1a116101c15780630fb90d1a1461024f57806326f438c51461026b578063299a7bcc146102755780633121db1c14610291576101e3565b806309f46839146101e75780630b467b9b146102175780630d1840ea14610233575b5f5ffd5b61020160048036038101906101fc9190613422565b6105d1565b60405161020e9190613467565b60405180910390f35b610231600480360381019061022c91906134e1565b6105ee565b005b61024d60048036038101906102489190613567565b610666565b005b61026960048036038101906102649190613592565b610763565b005b6102736108b9565b005b61028f600480360381019061028a9190613592565b610a3f565b005b6102ab60048036038101906102a69190613625565b610c81565b005b6102c760048036038101906102c29190613422565b610e38565b005b6102d1611083565b6040516102de9190613739565b60405180910390f35b6102ef611094565b6040516102fc9190613739565b60405180910390f35b61031f600480360381019061031a9190613783565b6110a5565b005b61033b600480360381019061033691906137c1565b6112ba565b005b6103456113a9565b6040516103529190613817565b60405180910390f35b610375600480360381019061037091906137c1565b6113cd565b6040516103829190613467565b60405180910390f35b610393611473565b6040516103a0919061383f565b60405180910390f35b6103c360048036038101906103be9190613422565b611498565b6040516103d09190613467565b60405180910390f35b6103f360048036038101906103ee9190613990565b61152c565b6040516104009190613817565b60405180910390f35b610423600480360381019061041e9190613592565b611559565b005b61043f600480360381019061043a9190613592565b61164b565b005b6104496116ed565b604051610456919061383f565b60405180910390f35b610479600480360381019061047491906139d7565b611711565b005b61049560048036038101906104909190613592565b611895565b005b61049f611a81565b6040516104ac9190613739565b60405180910390f35b6104cf60048036038101906104ca9190613422565b611a91565b6040516104dc919061383f565b60405180910390f35b6104ff60048036038101906104fa91906137c1565b611ac1565b005b61051b60048036038101906105169190613422565b611deb565b6040516105289190613467565b60405180910390f35b61054b60048036038101906105469190613625565b611e2a565b005b61056760048036038101906105629190613567565b611fe1565b005b610583600480360381019061057e91906134e1565b6120fb565b005b61059f600480360381019061059a9190613422565b6126be565b6040516105ac9190613739565b60405180910390f35b6105cf60048036038101906105ca9190613592565b61270c565b005b6004602052805f5260405f205f915054906101000a900460ff1681565b5f6105f983836128cb565b90505f6106078285856128ee565b90506106128161293d565b61066084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508284612a1b565b50505050565b806106708161293d565b5f8290505f63299a7bcc60e01b8460035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516024016106ec929190613a8f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905061075d818363299a7bcc60e01b612a1b565b50505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107e8576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361084d576040517f0cdbb77000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663920ed706825f6040518363ffffffff1660e01b8152600401610888929190613ab6565b5f604051808303815f87803b15801561089f575f5ffd5b505af11580156108b1573d5f5f3e3d5ffd5b505050505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461093f576040517f11cc639800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610acc612be7565b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b2c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b509190613af1565b73ffffffffffffffffffffffffffffffffffffffff1603610b9c576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff166313af4035826040518263ffffffff1660e01b8152600401610c50919061383f565b5f604051808303815f87803b158015610c67575f5ffd5b505af1158015610c79573d5f5f3e3d5ffd5b505050505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d06576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181604051610d16929190613b4a565b60405180910390208373ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa158015610d66573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610d8e9190613c0e565b8051906020012003610dcb576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663c47f002783836040518363ffffffff1660e01b8152600401610e06929190613c91565b5f604051808303815f87803b158015610e1d575f5ffd5b505af1158015610e2f573d5f5f3e3d5ffd5b50505050505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ebd576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f41576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fc6576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b606061108f6005612ca6565b905090565b60606110a06001612cc5565b905090565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461112a576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361118f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80151560045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611214576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f7ddfe1f63a92a8ccb04d4109064330f2fd92d60fb9ea99d7f276a9da94b0a7cb826040516112ae9190613467565b60405180910390a25050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461133f576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16632b30997b826040518263ffffffff1660e01b8152600401611378919061383f565b5f604051808303815f87803b15801561138f575f5ffd5b505af11580156113a1573d5f5f3e3d5ffd5b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f5f639b27a90e60e01b84846040516024016113ea929190613cb3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090505f60028260405161145a9190613d14565b9081526020016040518091039020541191505092915050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5f73ffffffffffffffffffffffffffffffffffffffff1660035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6002818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115de576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663920ed7068260016040518363ffffffff1660e01b815260040161161a929190613ab6565b5f604051808303815f87803b158015611631575f5ffd5b505af1158015611643573d5f5f3e3d5ffd5b505050505050565b816116558161293d565b5f8390505f639b27a90e60e01b8585604051602401611675929190613a8f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506116e68183639b27a90e60e01b612a1b565b5050505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b826117613360075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612df990919063ffffffff16565b611797576040517fef6d0f0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff16630b467b9b84846040518363ffffffff1660e01b81526004016117d2929190613d66565b5f604051808303815f87803b1580156117e9575f5ffd5b505af11580156117fb573d5f5f3e3d5ffd5b5050505061180983836128cb565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167faea2cba5da94dcdf29f38e34d350097037fe8f5be24caac01e19513b972dd1ea8686604051611887929190613d66565b60405180910390a450505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461191a576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611922612be7565b5f8290506119758260075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612e2690919063ffffffff16565b6119aa576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6119f060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612e53565b03611a0b57611a09816005612e2690919063ffffffff16565b505b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f5d17989a4aeeda75e413fe31d9ae4731017b8b4f094d35a492fd217d00e0807c60405160405180910390a4505050565b6060611a8c5f612cc5565b905090565b6003602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611b2957505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b611b5f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ba9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bcd9190613af1565b90505f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ca657508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148015611ca5575060045f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b5b611cdc576040517fa354ff9000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d2b8260075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612e6690919063ffffffff16565b611d60576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d74836005612e6690919063ffffffff16565b503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f42b94b097bf6b2d4d69d9c26a2ef138effda16b3d46c66a9ad78031af4c4185f60405160405180910390a4505050565b5f3073ffffffffffffffffffffffffffffffffffffffff16611e0c83612e93565b73ffffffffffffffffffffffffffffffffffffffff16149050919050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eaf576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181604051611ebf929190613b4a565b60405180910390208373ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015611f0f573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611f379190613c0e565b8051906020012003611f74576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663b84c824683836040518363ffffffff1660e01b8152600401611faf929190613c91565b5f604051808303815f87803b158015611fc6575f5ffd5b505af1158015611fd8573d5f5f3e3d5ffd5b50505050505050565b8073ffffffffffffffffffffffffffffffffffffffff1663ba03a75f306040518263ffffffff1660e01b815260040161201a919061383f565b602060405180830381865afa158015612035573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120599190613d9c565b1561208f576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663920ed7063060016040518363ffffffff1660e01b81526004016120cb929190613ab6565b5f604051808303815f87803b1580156120e2575f5ffd5b505af11580156120f4573d5f5f3e3d5ffd5b5050505050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612180576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60028383604051612193929190613b4a565b908152602001604051809103902054146121d9576040517f9b42992500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004828290501015612217576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61222283836128cb565b905061222d81612fa2565b612263576040517f1e8b844100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61226f8285856128ee565b90505f7f00000000000000000000000000000000000000000000000000000000000000004261229e9190613df4565b905063299a7bcc60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036125ae575f5f6122f9858888613041565b915091505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561236557505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61239b576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124089190613af1565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361246b576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461252c576040517f39fd2fa700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050612609565b639b27a90e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361260857612605838686613041565b50505b5b806002868660405161261c929190613b4a565b908152602001604051809103902081905550827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd8715a4596f2c33a2e65b4e88319978c3212391c814a704ef2237368cf601be98888866040516126af93929190613e27565b60405180910390a45050505050565b606061270560075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612ca6565b9050919050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612791576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663e66f53b76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127f1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128159190613af1565b73ffffffffffffffffffffffffffffffffffffffff1603612861576040517e219cf100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663e90956cf826040518263ffffffff1660e01b815260040161289a919061383f565b5f604051808303815f87803b1580156128b1575f5ffd5b505af11580156128c3573d5f5f3e3d5ffd5b505050505050565b5f60048383905010156128e3575f60e01b90506128e8565b823590505b92915050565b5f6128f884612fa2565b612904575f9050612936565b6024838390501015612918575f9050612936565b73ffffffffffffffffffffffffffffffffffffffff60048401351690505b9392505050565b61298c3360075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20612df990919063ffffffff16565b806129e257505f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612a18576040517fe0697a5300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b5f600284604051612a2c9190613d14565b90815260200160405180910390205403612a72576040517f1ea942a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63299a7bcc60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603612b3a575f60035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5f600284604051612b4b9190613d14565b908152602001604051809103902081905550807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f694a877f120341826111772ddbeeffe7bd01128eb7cdfa63b6dbdb0b95c8632d86604051612bda9190613e8f565b60405180910390a4505050565b5f60025f36604051612bfa929190613b4a565b90815260200160405180910390205490505f8103612c44576040517f1ea942a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80421015612c7e576040517f621e25c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60025f36604051612c91929190613b4a565b90815260200160405180910390208190555050565b60605f612cb4835f0161318e565b905060608190508092505050919050565b60605f612cd26005612e53565b90508067ffffffffffffffff811115612cee57612ced61386c565b5b604051908082528060200260200182016040528015612d1c5781602001602082028036833780820191505090505b5091505f5f5b82811015612dee575f612d3f8260056131e790919063ffffffff16565b90505f3073ffffffffffffffffffffffffffffffffffffffff16612d6283612e93565b73ffffffffffffffffffffffffffffffffffffffff1614905086151581151503612de15781868581518110612d9a57612d99613eaf565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083612dde90613edc565b93505b5050806001019050612d22565b508083525050919050565b5f612e1e835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6131fe565b905092915050565b5f612e4b835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61321e565b905092915050565b5f612e5f825f0161331a565b9050919050565b5f612e8b835f018373ffffffffffffffffffffffffffffffffffffffff165f1b613329565b905092915050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff16638da5cb5b60e01b604051602401604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612f259190613d14565b5f60405180830381855afa9150503d805f8114612f5d576040519150601f19603f3d011682016040523d82523d5f602084013e612f62565b606091505b5091509150811580612f75575060208151105b15612f84575f92505050612f9d565b80806020019051810190612f989190613f5e565b925050505b919050565b5f63299a7bcc60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061303a5750639b27a90e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b5f5f60448484905014613080576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff600485013516915073ffffffffffffffffffffffffffffffffffffffff60248501351690505f8583836040516024016130cf929190613cb3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905080805190602001208585604051613146929190613b4a565b604051809103902014613185576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50935093915050565b6060815f018054806020026020016040519081016040528092919081815260200182805480156131db57602002820191905f5260205f20905b8154815260200190600101908083116131c7575b50505050509050919050565b5f6131f4835f0183613390565b5f1c905092915050565b5f5f836001015f8481526020019081526020015f20541415905092915050565b5f5f836001015f8481526020019081526020015f205490505f811461330f575f60018261324b9190613f89565b90505f6001865f01805490506132619190613f89565b90508082146132c7575f865f0182815481106132805761327f613eaf565b5b905f5260205f200154905080875f0184815481106132a1576132a0613eaf565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f018054806132da576132d9613fbc565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050613314565b5f9150505b92915050565b5f815f01805490509050919050565b5f61333483836131fe565b61338657825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f20819055506001905061338a565b5f90505b92915050565b5f825f0182815481106133a6576133a5613eaf565b5b905f5260205f200154905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6133f1826133c8565b9050919050565b613401816133e7565b811461340b575f5ffd5b50565b5f8135905061341c816133f8565b92915050565b5f60208284031215613437576134366133c0565b5b5f6134448482850161340e565b91505092915050565b5f8115159050919050565b6134618161344d565b82525050565b5f60208201905061347a5f830184613458565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126134a1576134a0613480565b5b8235905067ffffffffffffffff8111156134be576134bd613484565b5b6020830191508360018202830111156134da576134d9613488565b5b9250929050565b5f5f602083850312156134f7576134f66133c0565b5b5f83013567ffffffffffffffff811115613514576135136133c4565b5b6135208582860161348c565b92509250509250929050565b5f613536826133e7565b9050919050565b6135468161352c565b8114613550575f5ffd5b50565b5f813590506135618161353d565b92915050565b5f6020828403121561357c5761357b6133c0565b5b5f61358984828501613553565b91505092915050565b5f5f604083850312156135a8576135a76133c0565b5b5f6135b585828601613553565b92505060206135c68582860161340e565b9150509250929050565b5f5f83601f8401126135e5576135e4613480565b5b8235905067ffffffffffffffff81111561360257613601613484565b5b60208301915083600182028301111561361e5761361d613488565b5b9250929050565b5f5f5f6040848603121561363c5761363b6133c0565b5b5f61364986828701613553565b935050602084013567ffffffffffffffff81111561366a576136696133c4565b5b613676868287016135d0565b92509250509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6136b4816133e7565b82525050565b5f6136c583836136ab565b60208301905092915050565b5f602082019050919050565b5f6136e782613682565b6136f1818561368c565b93506136fc8361369c565b805f5b8381101561372c57815161371388826136ba565b975061371e836136d1565b9250506001810190506136ff565b5085935050505092915050565b5f6020820190508181035f83015261375181846136dd565b905092915050565b6137628161344d565b811461376c575f5ffd5b50565b5f8135905061377d81613759565b92915050565b5f5f60408385031215613799576137986133c0565b5b5f6137a68582860161340e565b92505060206137b78582860161376f565b9150509250929050565b5f5f604083850312156137d7576137d66133c0565b5b5f6137e48582860161340e565b92505060206137f58582860161340e565b9150509250929050565b5f819050919050565b613811816137ff565b82525050565b5f60208201905061382a5f830184613808565b92915050565b613839816133e7565b82525050565b5f6020820190506138525f830184613830565b92915050565b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6138a28261385c565b810181811067ffffffffffffffff821117156138c1576138c061386c565b5b80604052505050565b5f6138d36133b7565b90506138df8282613899565b919050565b5f67ffffffffffffffff8211156138fe576138fd61386c565b5b6139078261385c565b9050602081019050919050565b828183375f83830152505050565b5f61393461392f846138e4565b6138ca565b9050828152602081018484840111156139505761394f613858565b5b61395b848285613914565b509392505050565b5f82601f83011261397757613976613480565b5b8135613987848260208601613922565b91505092915050565b5f602082840312156139a5576139a46133c0565b5b5f82013567ffffffffffffffff8111156139c2576139c16133c4565b5b6139ce84828501613963565b91505092915050565b5f5f5f604084860312156139ee576139ed6133c0565b5b5f6139fb8682870161340e565b935050602084013567ffffffffffffffff811115613a1c57613a1b6133c4565b5b613a288682870161348c565b92509250509250925092565b5f819050919050565b5f613a57613a52613a4d846133c8565b613a34565b6133c8565b9050919050565b5f613a6882613a3d565b9050919050565b5f613a7982613a5e565b9050919050565b613a8981613a6f565b82525050565b5f604082019050613aa25f830185613a80565b613aaf6020830184613830565b9392505050565b5f604082019050613ac95f830185613830565b613ad66020830184613458565b9392505050565b5f81519050613aeb816133f8565b92915050565b5f60208284031215613b0657613b056133c0565b5b5f613b1384828501613add565b91505092915050565b5f81905092915050565b5f613b318385613b1c565b9350613b3e838584613914565b82840190509392505050565b5f613b56828486613b26565b91508190509392505050565b5f67ffffffffffffffff821115613b7c57613b7b61386c565b5b613b858261385c565b9050602081019050919050565b8281835e5f83830152505050565b5f613bb2613bad84613b62565b6138ca565b905082815260208101848484011115613bce57613bcd613858565b5b613bd9848285613b92565b509392505050565b5f82601f830112613bf557613bf4613480565b5b8151613c05848260208601613ba0565b91505092915050565b5f60208284031215613c2357613c226133c0565b5b5f82015167ffffffffffffffff811115613c4057613c3f6133c4565b5b613c4c84828501613be1565b91505092915050565b5f82825260208201905092915050565b5f613c708385613c55565b9350613c7d838584613914565b613c868361385c565b840190509392505050565b5f6020820190508181035f830152613caa818486613c65565b90509392505050565b5f604082019050613cc65f830185613830565b613cd36020830184613830565b9392505050565b5f81519050919050565b5f613cee82613cda565b613cf88185613b1c565b9350613d08818560208601613b92565b80840191505092915050565b5f613d1f8284613ce4565b915081905092915050565b5f82825260208201905092915050565b5f613d458385613d2a565b9350613d52838584613914565b613d5b8361385c565b840190509392505050565b5f6020820190508181035f830152613d7f818486613d3a565b90509392505050565b5f81519050613d9681613759565b92915050565b5f60208284031215613db157613db06133c0565b5b5f613dbe84828501613d88565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613dfe826137ff565b9150613e09836137ff565b9250828201905080821115613e2157613e20613dc7565b5b92915050565b5f6040820190508181035f830152613e40818587613d3a565b9050613e4f6020830184613808565b949350505050565b5f613e6182613cda565b613e6b8185613d2a565b9350613e7b818560208601613b92565b613e848161385c565b840191505092915050565b5f6020820190508181035f830152613ea78184613e57565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f613ee6826137ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f1857613f17613dc7565b5b600182019050919050565b5f613f2d826133c8565b9050919050565b613f3d81613f23565b8114613f47575f5ffd5b50565b5f81519050613f5881613f34565b92915050565b5f60208284031215613f7357613f726133c0565b5b5f613f8084828501613f4a565b91505092915050565b5f613f93826137ff565b9150613f9e836137ff565b9250828203905081811115613fb657613fb5613dc7565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea2646970667358221220f1aed43836a4a54123a9c37ea8e7de6af4c4b223fc6f2fa69878f58e0a383b5c64736f6c634300081c00330000000000000000000000000000000000000000000000000000000000127500","name":"VaultV2Supervisor","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"prague","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[{"file_path":"lib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/structs/EnumerableSet.sol)\n// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Library for managing\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\n * types.\n *\n * Sets have the following properties:\n *\n * - Elements are added, removed, and checked for existence in constant time\n * (O(1)).\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\n *\n * ```solidity\n * contract Example {\n *     // Add the library methods\n *     using EnumerableSet for EnumerableSet.AddressSet;\n *\n *     // Declare a set state variable\n *     EnumerableSet.AddressSet private mySet;\n * }\n * ```\n *\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\n * and `uint256` (`UintSet`) are supported.\n *\n * [WARNING]\n * ====\n * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure\n * unusable.\n * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.\n *\n * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an\n * array of EnumerableSet.\n * ====\n */\nlibrary EnumerableSet {\n    // To implement this library for multiple types with as little code\n    // repetition as possible, we write it in terms of a generic Set type with\n    // bytes32 values.\n    // The Set implementation uses private functions, and user-facing\n    // implementations (such as AddressSet) are just wrappers around the\n    // underlying Set.\n    // This means that we can only create new EnumerableSets for types that fit\n    // in bytes32.\n\n    struct Set {\n        // Storage of set values\n        bytes32[] _values;\n        // Position is the index of the value in the `values` array plus 1.\n        // Position 0 is used to mean a value is not in the set.\n        mapping(bytes32 value => uint256) _positions;\n    }\n\n    /**\n     * @dev Add a value to a set. O(1).\n     *\n     * Returns true if the value was added to the set, that is if it was not\n     * already present.\n     */\n    function _add(Set storage set, bytes32 value) private returns (bool) {\n        if (!_contains(set, value)) {\n            set._values.push(value);\n            // The value is stored at length-1, but we add 1 to all indexes\n            // and use 0 as a sentinel value\n            set._positions[value] = set._values.length;\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the value was removed from the set, that is if it was\n     * present.\n     */\n    function _remove(Set storage set, bytes32 value) private returns (bool) {\n        // We cache the value's position to prevent multiple reads from the same storage slot\n        uint256 position = set._positions[value];\n\n        if (position != 0) {\n            // Equivalent to contains(set, value)\n            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\n            // the array, and then remove the last element (sometimes called as 'swap and pop').\n            // This modifies the order of the array, as noted in {at}.\n\n            uint256 valueIndex = position - 1;\n            uint256 lastIndex = set._values.length - 1;\n\n            if (valueIndex != lastIndex) {\n                bytes32 lastValue = set._values[lastIndex];\n\n                // Move the lastValue to the index where the value to delete is\n                set._values[valueIndex] = lastValue;\n                // Update the tracked position of the lastValue (that was just moved)\n                set._positions[lastValue] = position;\n            }\n\n            // Delete the slot where the moved value was stored\n            set._values.pop();\n\n            // Delete the tracked position for the deleted slot\n            delete set._positions[value];\n\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Returns true if the value is in the set. O(1).\n     */\n    function _contains(Set storage set, bytes32 value) private view returns (bool) {\n        return set._positions[value] != 0;\n    }\n\n    /**\n     * @dev Returns the number of values on the set. O(1).\n     */\n    function _length(Set storage set) private view returns (uint256) {\n        return set._values.length;\n    }\n\n    /**\n     * @dev Returns the value stored at position `index` in the set. O(1).\n     *\n     * Note that there are no guarantees on the ordering of values inside the\n     * array, and it may change when more values are added or removed.\n     *\n     * Requirements:\n     *\n     * - `index` must be strictly less than {length}.\n     */\n    function _at(Set storage set, uint256 index) private view returns (bytes32) {\n        return set._values[index];\n    }\n\n    /**\n     * @dev Return the entire set in an array\n     *\n     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n     * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n     */\n    function _values(Set storage set) private view returns (bytes32[] memory) {\n        return set._values;\n    }\n\n    // Bytes32Set\n\n    struct Bytes32Set {\n        Set _inner;\n    }\n\n    /**\n     * @dev Add a value to a set. O(1).\n     *\n     * Returns true if the value was added to the set, that is if it was not\n     * already present.\n     */\n    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n        return _add(set._inner, value);\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the value was removed from the set, that is if it was\n     * present.\n     */\n    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\n        return _remove(set._inner, value);\n    }\n\n    /**\n     * @dev Returns true if the value is in the set. O(1).\n     */\n    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\n        return _contains(set._inner, value);\n    }\n\n    /**\n     * @dev Returns the number of values in the set. O(1).\n     */\n    function length(Bytes32Set storage set) internal view returns (uint256) {\n        return _length(set._inner);\n    }\n\n    /**\n     * @dev Returns the value stored at position `index` in the set. O(1).\n     *\n     * Note that there are no guarantees on the ordering of values inside the\n     * array, and it may change when more values are added or removed.\n     *\n     * Requirements:\n     *\n     * - `index` must be strictly less than {length}.\n     */\n    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\n        return _at(set._inner, index);\n    }\n\n    /**\n     * @dev Return the entire set in an array\n     *\n     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n     * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n     */\n    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\n        bytes32[] memory store = _values(set._inner);\n        bytes32[] memory result;\n\n        /// @solidity memory-safe-assembly\n        assembly {\n            result := store\n        }\n\n        return result;\n    }\n\n    // AddressSet\n\n    struct AddressSet {\n        Set _inner;\n    }\n\n    /**\n     * @dev Add a value to a set. O(1).\n     *\n     * Returns true if the value was added to the set, that is if it was not\n     * already present.\n     */\n    function add(AddressSet storage set, address value) internal returns (bool) {\n        return _add(set._inner, bytes32(uint256(uint160(value))));\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the value was removed from the set, that is if it was\n     * present.\n     */\n    function remove(AddressSet storage set, address value) internal returns (bool) {\n        return _remove(set._inner, bytes32(uint256(uint160(value))));\n    }\n\n    /**\n     * @dev Returns true if the value is in the set. O(1).\n     */\n    function contains(AddressSet storage set, address value) internal view returns (bool) {\n        return _contains(set._inner, bytes32(uint256(uint160(value))));\n    }\n\n    /**\n     * @dev Returns the number of values in the set. O(1).\n     */\n    function length(AddressSet storage set) internal view returns (uint256) {\n        return _length(set._inner);\n    }\n\n    /**\n     * @dev Returns the value stored at position `index` in the set. O(1).\n     *\n     * Note that there are no guarantees on the ordering of values inside the\n     * array, and it may change when more values are added or removed.\n     *\n     * Requirements:\n     *\n     * - `index` must be strictly less than {length}.\n     */\n    function at(AddressSet storage set, uint256 index) internal view returns (address) {\n        return address(uint160(uint256(_at(set._inner, index))));\n    }\n\n    /**\n     * @dev Return the entire set in an array\n     *\n     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n     * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n     */\n    function values(AddressSet storage set) internal view returns (address[] memory) {\n        bytes32[] memory store = _values(set._inner);\n        address[] memory result;\n\n        /// @solidity memory-safe-assembly\n        assembly {\n            result := store\n        }\n\n        return result;\n    }\n\n    // UintSet\n\n    struct UintSet {\n        Set _inner;\n    }\n\n    /**\n     * @dev Add a value to a set. O(1).\n     *\n     * Returns true if the value was added to the set, that is if it was not\n     * already present.\n     */\n    function add(UintSet storage set, uint256 value) internal returns (bool) {\n        return _add(set._inner, bytes32(value));\n    }\n\n    /**\n     * @dev Removes a value from a set. O(1).\n     *\n     * Returns true if the value was removed from the set, that is if it was\n     * present.\n     */\n    function remove(UintSet storage set, uint256 value) internal returns (bool) {\n        return _remove(set._inner, bytes32(value));\n    }\n\n    /**\n     * @dev Returns true if the value is in the set. O(1).\n     */\n    function contains(UintSet storage set, uint256 value) internal view returns (bool) {\n        return _contains(set._inner, bytes32(value));\n    }\n\n    /**\n     * @dev Returns the number of values in the set. O(1).\n     */\n    function length(UintSet storage set) internal view returns (uint256) {\n        return _length(set._inner);\n    }\n\n    /**\n     * @dev Returns the value stored at position `index` in the set. O(1).\n     *\n     * Note that there are no guarantees on the ordering of values inside the\n     * array, and it may change when more values are added or removed.\n     *\n     * Requirements:\n     *\n     * - `index` must be strictly less than {length}.\n     */\n    function at(UintSet storage set, uint256 index) internal view returns (uint256) {\n        return uint256(_at(set._inner, index));\n    }\n\n    /**\n     * @dev Return the entire set in an array\n     *\n     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\n     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\n     * this function has an unbounded cost, and using it as part of a state-changing function may render the function\n     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\n     */\n    function values(UintSet storage set) internal view returns (uint256[] memory) {\n        bytes32[] memory store = _values(set._inner);\n        uint256[] memory result;\n\n        /// @solidity memory-safe-assembly\n        assembly {\n            result := store\n        }\n\n        return result;\n    }\n}\n"},{"file_path":"lib/vault-v2/src/interfaces/IERC20.sol","source_code":"// SPDX-License-Identifier: GPL-2.0-or-later\n// Copyright (c) 2025 Morpho Association\npragma solidity >=0.5.0;\n\ninterface IERC20 {\n    function decimals() external view returns (uint8);\n    function name() external view returns (string memory);\n    function symbol() external view returns (string memory);\n    function totalSupply() external view returns (uint256);\n    function balanceOf(address account) external view returns (uint256);\n    function transfer(address to, uint256 shares) external returns (bool success);\n    function transferFrom(address from, address to, uint256 shares) external returns (bool success);\n    function approve(address spender, uint256 shares) external returns (bool success);\n    function allowance(address owner, address spender) external view returns (uint256);\n}\n"},{"file_path":"lib/vault-v2/src/interfaces/IERC2612.sol","source_code":"// SPDX-License-Identifier: GPL-2.0-or-later\n// Copyright (c) 2025 Morpho Association\npragma solidity >=0.5.0;\n\ninterface IERC2612 {\n    function permit(address owner, address spender, uint256 shares, uint256 deadline, uint8 v, bytes32 r, bytes32 s)\n        external;\n    function nonces(address owner) external view returns (uint256);\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n"},{"file_path":"lib/vault-v2/src/interfaces/IERC4626.sol","source_code":"// SPDX-License-Identifier: GPL-2.0-or-later\n// Copyright (c) 2025 Morpho Association\npragma solidity >=0.5.0;\n\nimport {IERC20} from \"./IERC20.sol\";\n\ninterface IERC4626 is IERC20 {\n    function asset() external view returns (address);\n    function totalAssets() external view returns (uint256);\n    function convertToAssets(uint256 shares) external view returns (uint256 assets);\n    function convertToShares(uint256 assets) external view returns (uint256 shares);\n    function deposit(uint256 assets, address onBehalf) external returns (uint256 shares);\n    function mint(uint256 shares, address onBehalf) external returns (uint256 assets);\n    function withdraw(uint256 assets, address receiver, address onBehalf) external returns (uint256 shares);\n    function redeem(uint256 shares, address receiver, address onBehalf) external returns (uint256 assets);\n    function previewDeposit(uint256 assets) external view returns (uint256 shares);\n    function previewMint(uint256 shares) external view returns (uint256 assets);\n    function previewWithdraw(uint256 assets) external view returns (uint256 shares);\n    function previewRedeem(uint256 shares) external view returns (uint256 assets);\n    function maxDeposit(address onBehalf) external view returns (uint256 assets);\n    function maxMint(address onBehalf) external view returns (uint256 shares);\n    function maxWithdraw(address onBehalf) external view returns (uint256 assets);\n    function maxRedeem(address onBehalf) external view returns (uint256 shares);\n}\n"},{"file_path":"lib/vault-v2/src/interfaces/IVaultV2.sol","source_code":"// SPDX-License-Identifier: GPL-2.0-or-later\n// Copyright (c) 2025 Morpho Association\npragma solidity >=0.5.0;\n\nimport {IERC4626} from \"./IERC4626.sol\";\nimport {IERC2612} from \"./IERC2612.sol\";\n\nstruct Caps {\n    uint256 allocation;\n    uint128 absoluteCap;\n    uint128 relativeCap;\n}\n\ninterface IVaultV2 is IERC4626, IERC2612 {\n    // State variables\n    function virtualShares() external view returns (uint256);\n    function owner() external view returns (address);\n    function curator() external view returns (address);\n    function receiveSharesGate() external view returns (address);\n    function sendSharesGate() external view returns (address);\n    function receiveAssetsGate() external view returns (address);\n    function sendAssetsGate() external view returns (address);\n    function adapterRegistry() external view returns (address);\n    function isSentinel(address account) external view returns (bool);\n    function isAllocator(address account) external view returns (bool);\n    function firstTotalAssets() external view returns (uint256);\n    function _totalAssets() external view returns (uint128);\n    function lastUpdate() external view returns (uint64);\n    function maxRate() external view returns (uint64);\n    function adapters(uint256 index) external view returns (address);\n    function adaptersLength() external view returns (uint256);\n    function isAdapter(address account) external view returns (bool);\n    function allocation(bytes32 id) external view returns (uint256);\n    function absoluteCap(bytes32 id) external view returns (uint256);\n    function relativeCap(bytes32 id) external view returns (uint256);\n    function forceDeallocatePenalty(address adapter) external view returns (uint256);\n    function liquidityAdapter() external view returns (address);\n    function liquidityData() external view returns (bytes memory);\n    function timelock(bytes4 selector) external view returns (uint256);\n    function abdicated(bytes4 selector) external view returns (bool);\n    function executableAt(bytes memory data) external view returns (uint256);\n    function performanceFee() external view returns (uint96);\n    function performanceFeeRecipient() external view returns (address);\n    function managementFee() external view returns (uint96);\n    function managementFeeRecipient() external view returns (address);\n\n    // Gating\n    function canSendShares(address account) external view returns (bool);\n    function canReceiveShares(address account) external view returns (bool);\n    function canSendAssets(address account) external view returns (bool);\n    function canReceiveAssets(address account) external view returns (bool);\n\n    // Multicall\n    function multicall(bytes[] memory data) external;\n\n    // Owner functions\n    function setOwner(address newOwner) external;\n    function setCurator(address newCurator) external;\n    function setIsSentinel(address account, bool isSentinel) external;\n    function setName(string memory newName) external;\n    function setSymbol(string memory newSymbol) external;\n\n    // Timelocks for curator functions\n    function submit(bytes memory data) external;\n    function revoke(bytes memory data) external;\n\n    // Curator functions\n    function setIsAllocator(address account, bool newIsAllocator) external;\n    function setReceiveSharesGate(address newReceiveSharesGate) external;\n    function setSendSharesGate(address newSendSharesGate) external;\n    function setReceiveAssetsGate(address newReceiveAssetsGate) external;\n    function setSendAssetsGate(address newSendAssetsGate) external;\n    function setAdapterRegistry(address newAdapterRegistry) external;\n    function addAdapter(address account) external;\n    function removeAdapter(address account) external;\n    function increaseTimelock(bytes4 selector, uint256 newDuration) external;\n    function decreaseTimelock(bytes4 selector, uint256 newDuration) external;\n    function abdicate(bytes4 selector) external;\n    function setPerformanceFee(uint256 newPerformanceFee) external;\n    function setManagementFee(uint256 newManagementFee) external;\n    function setPerformanceFeeRecipient(address newPerformanceFeeRecipient) external;\n    function setManagementFeeRecipient(address newManagementFeeRecipient) external;\n    function increaseAbsoluteCap(bytes memory idData, uint256 newAbsoluteCap) external;\n    function decreaseAbsoluteCap(bytes memory idData, uint256 newAbsoluteCap) external;\n    function increaseRelativeCap(bytes memory idData, uint256 newRelativeCap) external;\n    function decreaseRelativeCap(bytes memory idData, uint256 newRelativeCap) external;\n    function setMaxRate(uint256 newMaxRate) external;\n    function setForceDeallocatePenalty(address adapter, uint256 newForceDeallocatePenalty) external;\n\n    // Allocator functions\n    function allocate(address adapter, bytes memory data, uint256 assets) external;\n    function deallocate(address adapter, bytes memory data, uint256 assets) external;\n    function setLiquidityAdapterAndData(address newLiquidityAdapter, bytes memory newLiquidityData) external;\n\n    // Exchange rate\n    function accrueInterest() external;\n    function accrueInterestView()\n        external\n        view\n        returns (uint256 newTotalAssets, uint256 performanceFeeShares, uint256 managementFeeShares);\n\n    // Force deallocate\n    function forceDeallocate(address adapter, bytes memory data, uint256 assets, address onBehalf)\n        external\n        returns (uint256 penaltyShares);\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"uint256","name":"timelock_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CannotRemoveSupervisorSentinel","type":"error"},{"inputs":[],"name":"DataAlreadyTimelocked","type":"error"},{"inputs":[],"name":"DataNotTimelocked","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidTimelock","type":"error"},{"inputs":[],"name":"NoOp","type":"error"},{"inputs":[],"name":"NotGuardian","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"NotPendingSupervisorOwner","type":"error"},{"inputs":[],"name":"OnlyOwnerOrGuardian","type":"error"},{"inputs":[],"name":"OnlyOwnerOrVaultOwner","type":"error"},{"inputs":[],"name":"OwnershipChangeAlreadyScheduled","type":"error"},{"inputs":[],"name":"TimelockNotExpired","type":"error"},{"inputs":[],"name":"UnsupportedSelector","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vaultOwner","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"AllowedVaultOwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"guardian","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"GuardianAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"address","name":"guardian","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"GuardianRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"bytes4","name":"selector","type":"bytes4"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"TimelockRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"bytes4","name":"selector","type":"bytes4"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"executeAfter","type":"uint256"}],"name":"TimelockSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"vault","type":"address"},{"indexed":true,"internalType":"bytes4","name":"selector","type":"bytes4"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"VaultRevokeForwarded","type":"event"},{"inputs":[],"name":"TIMELOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptSupervisorOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"guardian","type":"address"}],"name":"addGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVaultV2","name":"vault","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"addSentinel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vaultOwner","type":"address"}],"name":"allowedVaultOwners","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executableAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"getGuardians","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNonOwnedVaults","outputs":[{"internalType":"address[]","name":"nonOwnedVaults","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwnedVaults","outputs":[{"internalType":"address[]","name":"ownedVaults","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVaults","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"guardian","type":"address"}],"name":"isGuardianBeingRemoved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"isOwnershipChanging","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"isVaultSupervised","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingSupervisorOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IVaultV2","name":"vault","type":"address"},{"internalType":"address","name":"guardian","type":"address"}],"name":"removeGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVaultV2","name":"vault","type":"address"},{"internalType":"address","name":"sentinel","type":"address"}],"name":"removeSentinel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVaultV2","name":"vault","type":"address"},{"internalType":"address","name":"guardian","type":"address"}],"name":"revokeGuardianRemoval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVaultV2","name":"vault","type":"address"}],"name":"revokeVaultOwnerChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"}],"name":"scheduledNewOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vaultOwner","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"setAllowedVaultOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVaultV2","name":"vault","type":"address"},{"internalType":"address","name":"newCurator","type":"address"}],"name":"setCurator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVaultV2","name":"vault","type":"address"},{"internalType":"string","name":"newName","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVaultV2","name":"vault","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"skimable","type":"address"},{"internalType":"address","name":"newSkimRecipient","type":"address"}],"name":"setSkimRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVaultV2","name":"vault","type":"address"}],"name":"setSupervisorAsSentinel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVaultV2","name":"vault","type":"address"},{"internalType":"string","name":"newSymbol","type":"string"}],"name":"setSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"submit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferSupervisorOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":"0x0000000000000000000000000000000000000000000000000000000000127500"}