From 8c98c80376c3b6d72bffeab62ee45a74449b6ef5 Mon Sep 17 00:00:00 2001 From: Christopher Dimitri Sastropranoto Date: Sun, 9 Jun 2024 21:16:50 -0700 Subject: [PATCH] KS-306: Return hashed capability ids (#13453) * return hashed capability ids * update error message when node does not exist * update wrappers --- .changeset/cool-turtles-think.md | 5 +++ .changeset/moody-dogs-begin.md | 5 +++ contracts/.changeset/long-jars-protect.md | 5 +++ contracts/.changeset/swift-ads-stare.md | 5 +++ contracts/gas-snapshots/keystone.gas-snapshot | 26 +++++------ .../src/v0.8/keystone/CapabilityRegistry.sol | 45 ++++++++++++------- .../src/v0.8/keystone/test/BaseTest.t.sol | 2 +- .../CapabilityRegistry_AddNodesTest.t.sol | 2 +- ...pabilityRegistry_GetCapabilitiesTest.t.sol | 14 +++++- .../CapabilityRegistry_RemoveNodesTest.t.sol | 4 +- .../CapabilityRegistry_UpdateNodesTest.t.sol | 4 +- .../keystone_capability_registry.go | 19 ++++---- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 13 files changed, 91 insertions(+), 47 deletions(-) create mode 100644 .changeset/cool-turtles-think.md create mode 100644 .changeset/moody-dogs-begin.md create mode 100644 contracts/.changeset/long-jars-protect.md create mode 100644 contracts/.changeset/swift-ads-stare.md diff --git a/.changeset/cool-turtles-think.md b/.changeset/cool-turtles-think.md new file mode 100644 index 00000000000..87632021656 --- /dev/null +++ b/.changeset/cool-turtles-think.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal return hashed capability ids diff --git a/.changeset/moody-dogs-begin.md b/.changeset/moody-dogs-begin.md new file mode 100644 index 00000000000..7b0753fd73d --- /dev/null +++ b/.changeset/moody-dogs-begin.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal update error message when node does not exist diff --git a/contracts/.changeset/long-jars-protect.md b/contracts/.changeset/long-jars-protect.md new file mode 100644 index 00000000000..2e5a11e3c8b --- /dev/null +++ b/contracts/.changeset/long-jars-protect.md @@ -0,0 +1,5 @@ +--- +'@chainlink/contracts': patch +--- + +update error message when node does not exist diff --git a/contracts/.changeset/swift-ads-stare.md b/contracts/.changeset/swift-ads-stare.md new file mode 100644 index 00000000000..33a5d0cf16d --- /dev/null +++ b/contracts/.changeset/swift-ads-stare.md @@ -0,0 +1,5 @@ +--- +'@chainlink/contracts': patch +--- + +return hashed capability ids diff --git a/contracts/gas-snapshots/keystone.gas-snapshot b/contracts/gas-snapshots/keystone.gas-snapshot index d01543529cb..0cc6650f860 100644 --- a/contracts/gas-snapshots/keystone.gas-snapshot +++ b/contracts/gas-snapshots/keystone.gas-snapshot @@ -15,37 +15,37 @@ CapabilityRegistry_AddDONTest:test_RevertWhen_NodeDoesNotSupportCapability() (ga CapabilityRegistry_AddNodeOperatorsTest:test_AddNodeOperators() (gas: 184267) CapabilityRegistry_AddNodeOperatorsTest:test_RevertWhen_CalledByNonAdmin() (gas: 17624) CapabilityRegistry_AddNodeOperatorsTest:test_RevertWhen_NodeOperatorAdminAddressZero() (gas: 18520) -CapabilityRegistry_AddNodesTest:test_AddsNodeInfo() (gas: 355458) -CapabilityRegistry_AddNodesTest:test_OwnerCanAddNodes() (gas: 355446) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingDuplicateP2PId() (gas: 301431) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 55243) +CapabilityRegistry_AddNodesTest:test_AddsNodeInfo() (gas: 355444) +CapabilityRegistry_AddNodesTest:test_OwnerCanAddNodes() (gas: 355432) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingDuplicateP2PId() (gas: 301394) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidCapability() (gas: 55229) CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithInvalidNodeOperator() (gas: 24962) -CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithoutCapabilities() (gas: 27738) +CapabilityRegistry_AddNodesTest:test_RevertWhen_AddingNodeWithoutCapabilities() (gas: 27724) CapabilityRegistry_AddNodesTest:test_RevertWhen_CalledByNonNodeOperatorAdminAndNonOwner() (gas: 25130) -CapabilityRegistry_AddNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 27444) -CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 27083) -CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressNotUnique() (gas: 309850) +CapabilityRegistry_AddNodesTest:test_RevertWhen_P2PIDEmpty() (gas: 27430) +CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressEmpty() (gas: 27069) +CapabilityRegistry_AddNodesTest:test_RevertWhen_SignerAddressNotUnique() (gas: 309822) CapabilityRegistry_DeprecateCapabilitiesTest:test_DeprecatesCapability() (gas: 92873) CapabilityRegistry_DeprecateCapabilitiesTest:test_EmitsEvent() (gas: 93001) CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CalledByNonAdmin() (gas: 22879) CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CapabilityDoesNotExist() (gas: 16166) CapabilityRegistry_DeprecateCapabilitiesTest:test_RevertWhen_CapabilityIsDeprecated() (gas: 94265) -CapabilityRegistry_GetCapabilitiesTest:test_ExcludesDeprecatedCapabilities() (gas: 119306) -CapabilityRegistry_GetCapabilitiesTest:test_ReturnsCapabilities() (gas: 54034) +CapabilityRegistry_GetCapabilitiesTest:test_ExcludesDeprecatedCapabilities() (gas: 122065) +CapabilityRegistry_GetCapabilitiesTest:test_ReturnsCapabilities() (gas: 58327) CapabilityRegistry_GetDONsTest:test_CorrectlyFetchesDONs() (gas: 65704) CapabilityRegistry_GetDONsTest:test_DoesNotIncludeRemovedDONs() (gas: 88473) CapabilityRegistry_GetHashedCapabilityTest:test_CorrectlyGeneratesHashedCapabilityId() (gas: 11428) CapabilityRegistry_GetHashedCapabilityTest:test_DoesNotCauseIncorrectClashes() (gas: 13087) CapabilityRegistry_GetNodeOperatorsTest:test_CorrectlyFetchesNodeOperators() (gas: 36675) CapabilityRegistry_GetNodeOperatorsTest:test_DoesNotIncludeRemovedNodeOperators() (gas: 38982) -CapabilityRegistry_GetNodesTest:test_CorrectlyFetchesNodes() (gas: 59880) -CapabilityRegistry_GetNodesTest:test_DoesNotIncludeRemovedNodes() (gas: 71576) +CapabilityRegistry_GetNodesTest:test_CorrectlyFetchesNodes() (gas: 59861) +CapabilityRegistry_GetNodesTest:test_DoesNotIncludeRemovedNodes() (gas: 71561) CapabilityRegistry_RemoveDONsTest:test_RemovesDON() (gas: 60696) CapabilityRegistry_RemoveDONsTest:test_RevertWhen_CalledByNonAdmin() (gas: 15669) CapabilityRegistry_RemoveDONsTest:test_RevertWhen_DONDoesNotExist() (gas: 16540) CapabilityRegistry_RemoveNodeOperatorsTest:test_RemovesNodeOperator() (gas: 36069) CapabilityRegistry_RemoveNodeOperatorsTest:test_RevertWhen_CalledByNonOwner() (gas: 15838) -CapabilityRegistry_RemoveNodesTest:test_CanAddNodeWithSameSignerAddressAfterRemoving() (gas: 114067) +CapabilityRegistry_RemoveNodesTest:test_CanAddNodeWithSameSignerAddressAfterRemoving() (gas: 114053) CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenDONDeleted() (gas: 371521) CapabilityRegistry_RemoveNodesTest:test_CanRemoveWhenNodeNoLongerPartOfDON() (gas: 712537) CapabilityRegistry_RemoveNodesTest:test_OwnerCanRemoveNodes() (gas: 72324) diff --git a/contracts/src/v0.8/keystone/CapabilityRegistry.sol b/contracts/src/v0.8/keystone/CapabilityRegistry.sol index 33cd684e471..c2462bfecf8 100644 --- a/contracts/src/v0.8/keystone/CapabilityRegistry.sol +++ b/contracts/src/v0.8/keystone/CapabilityRegistry.sol @@ -215,7 +215,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { error InvalidNodeOperatorAdmin(); /// @notice This error is thrown when trying to add a node with P2P ID that - /// is empty bytes or a duplicate. + /// is empty bytes /// @param p2pId The provided P2P ID error InvalidNodeP2PId(bytes32 p2pId); @@ -233,12 +233,17 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// been used by another node error InvalidNodeSigner(); - /// @notice This error is thrown when trying add a capability that already + /// @notice This error is thrown when trying to add a capability that already /// exists. /// @param hashedCapabilityId The hashed capability ID of the capability /// that already exists error CapabilityAlreadyExists(bytes32 hashedCapabilityId); + /// @notice This error is thrown when trying to add a node that already + /// exists. + /// @param nodeP2PId The P2P ID of the node that already exists + error NodeAlreadyExists(bytes32 nodeP2PId); + /// @notice This error is thrown when trying to add a node to a DON where /// the node does not support the capability /// @param nodeP2PId The P2P ID of the node @@ -272,6 +277,11 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @param hashedCapabilityId The hashed ID of the capability that is deprecated. error CapabilityIsDeprecated(bytes32 hashedCapabilityId); + /// @notice This error is thrown when a node with the provided P2P ID is + /// not found. + /// @param nodeP2PId The node P2P ID used for the lookup. + error NodeDoesNotExist(bytes32 nodeP2PId); + /// @notice This error is thrown when a node operator does not exist /// @param nodeOperatorId The ID of the node operator that does not exist error NodeOperatorDoesNotExist(uint32 nodeOperatorId); @@ -469,9 +479,10 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(msg.sender); Node storage storedNode = s_nodes[node.p2pId]; - if (storedNode.signer != bytes32("") || bytes32(node.p2pId) == bytes32("")) revert InvalidNodeP2PId(node.p2pId); + if (storedNode.signer != bytes32("")) revert NodeAlreadyExists(node.p2pId); + if (node.p2pId == bytes32("")) revert InvalidNodeP2PId(node.p2pId); - if (bytes32(node.signer) == bytes32("") || s_nodeSigners.contains(node.signer)) revert InvalidNodeSigner(); + if (node.signer == bytes32("") || s_nodeSigners.contains(node.signer)) revert InvalidNodeSigner(); bytes32[] memory capabilityIds = node.hashedCapabilityIds; if (capabilityIds.length == 0) revert InvalidNodeCapabilities(capabilityIds); @@ -503,7 +514,7 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { Node storage node = s_nodes[p2pId]; - if (bytes32(node.signer) == bytes32("")) revert InvalidNodeP2PId(p2pId); + if (node.signer == bytes32("")) revert NodeDoesNotExist(p2pId); if (node.supportedDONIds.length() > 0) revert NodePartOfDON(p2pId); if (!isOwner && msg.sender != s_nodeOperators[node.nodeOperatorId].admin) revert AccessForbidden(msg.sender); @@ -526,11 +537,10 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { if (!isOwner && msg.sender != nodeOperator.admin) revert AccessForbidden(msg.sender); Node storage storedNode = s_nodes[node.p2pId]; - if (storedNode.signer == bytes32("")) revert InvalidNodeP2PId(node.p2pId); + if (storedNode.signer == bytes32("")) revert NodeDoesNotExist(node.p2pId); - if ( - bytes32(node.signer) == bytes32("") || (storedNode.signer != node.signer && s_nodeSigners.contains(node.signer)) - ) revert InvalidNodeSigner(); + if (node.signer == bytes32("") || (storedNode.signer != node.signer && s_nodeSigners.contains(node.signer))) + revert InvalidNodeSigner(); bytes32[] memory supportedHashedCapabilityIds = node.hashedCapabilityIds; if (supportedHashedCapabilityIds.length == 0) revert InvalidNodeCapabilities(supportedHashedCapabilityIds); @@ -623,15 +633,17 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { /// @notice Returns all capabilities. This operation will copy capabilities /// to memory, which can be quite expensive. This is designed to mostly be /// used by view accessors that are queried without any gas fees. - /// @return Capability[] An array of capabilities - function getCapabilities() external view returns (Capability[] memory) { + /// @return bytes32[] List of hashed capability Ids + /// @return Capability[] List of capabilities + function getCapabilities() external view returns (bytes32[] memory, Capability[] memory) { bytes32[] memory hashedCapabilityIds = s_hashedCapabilityIds.values(); + uint256 numSupportedCapabilities = hashedCapabilityIds.length - s_deprecatedHashedCapabilityIds.length(); + // Solidity does not support dynamic arrays in memory, so we create a // fixed-size array and copy the capabilities into it. - Capability[] memory capabilities = new Capability[]( - hashedCapabilityIds.length - s_deprecatedHashedCapabilityIds.length() - ); + Capability[] memory capabilities = new Capability[](numSupportedCapabilities); + bytes32[] memory supportedHashedCapabilityIds = new bytes32[](numSupportedCapabilities); // We need to keep track of the new index because we are skipping // deprecated capabilities. @@ -642,11 +654,12 @@ contract CapabilityRegistry is OwnerIsCreator, TypeAndVersionInterface { if (!s_deprecatedHashedCapabilityIds.contains(hashedCapabilityId)) { capabilities[newIndex] = s_capabilities[hashedCapabilityId]; - newIndex++; + supportedHashedCapabilityIds[newIndex] = hashedCapabilityId; + ++newIndex; } } - return capabilities; + return (supportedHashedCapabilityIds, capabilities); } /// @notice This functions returns a capability id that has been hashed to fit into a bytes32 for cheaper access diff --git a/contracts/src/v0.8/keystone/test/BaseTest.t.sol b/contracts/src/v0.8/keystone/test/BaseTest.t.sol index 3df0b6ca7c7..795bb40843e 100644 --- a/contracts/src/v0.8/keystone/test/BaseTest.t.sol +++ b/contracts/src/v0.8/keystone/test/BaseTest.t.sol @@ -46,7 +46,7 @@ contract BaseTest is Test, Constants { s_nonExistentHashedCapabilityId = s_capabilityRegistry.getHashedCapabilityId("non-existent-capability", "1.0.0"); } - function _getNodeOperators() internal view returns (CapabilityRegistry.NodeOperator[] memory) { + function _getNodeOperators() internal pure returns (CapabilityRegistry.NodeOperator[] memory) { CapabilityRegistry.NodeOperator[] memory nodeOperators = new CapabilityRegistry.NodeOperator[](3); nodeOperators[0] = CapabilityRegistry.NodeOperator({admin: NODE_OPERATOR_ONE_ADMIN, name: NODE_OPERATOR_ONE_NAME}); nodeOperators[1] = CapabilityRegistry.NodeOperator({admin: NODE_OPERATOR_TWO_ADMIN, name: NODE_OPERATOR_TWO_NAME}); diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol index 941712edb15..7bb4eb43c4d 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_AddNodesTest.t.sol @@ -121,7 +121,7 @@ contract CapabilityRegistry_AddNodesTest is BaseTest { s_capabilityRegistry.addNodes(nodes); - vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeP2PId.selector, P2P_ID)); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.NodeAlreadyExists.selector, P2P_ID)); s_capabilityRegistry.addNodes(nodes); } diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_GetCapabilitiesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_GetCapabilitiesTest.t.sol index 60890db3377..e2dff281252 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_GetCapabilitiesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_GetCapabilitiesTest.t.sol @@ -14,7 +14,12 @@ contract CapabilityRegistry_GetCapabilitiesTest is BaseTest { } function test_ReturnsCapabilities() public view { - CapabilityRegistry.Capability[] memory capabilities = s_capabilityRegistry.getCapabilities(); + (bytes32[] memory hashedCapabilityIds, CapabilityRegistry.Capability[] memory capabilities) = s_capabilityRegistry + .getCapabilities(); + + assertEq(hashedCapabilityIds.length, 2); + assertEq(hashedCapabilityIds[0], keccak256(abi.encode(capabilities[0].labelledName, capabilities[0].version))); + assertEq(hashedCapabilityIds[1], keccak256(abi.encode(capabilities[1].labelledName, capabilities[1].version))); assertEq(capabilities.length, 2); @@ -43,7 +48,12 @@ contract CapabilityRegistry_GetCapabilitiesTest is BaseTest { deprecatedCapabilities[0] = hashedCapabilityId; s_capabilityRegistry.deprecateCapabilities(deprecatedCapabilities); - CapabilityRegistry.Capability[] memory capabilities = s_capabilityRegistry.getCapabilities(); + (bytes32[] memory hashedCapabilityIds, CapabilityRegistry.Capability[] memory capabilities) = s_capabilityRegistry + .getCapabilities(); + + assertEq(hashedCapabilityIds.length, 1); + assertEq(hashedCapabilityIds[0], keccak256(abi.encode(capabilities[0].labelledName, capabilities[0].version))); + assertEq(capabilities.length, 1); assertEq(capabilities[0].labelledName, "read-ethereum-mainnet-gas-price"); diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodesTest.t.sol index 0c6b4a9651c..ac59435e35a 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_RemoveNodesTest.t.sol @@ -62,7 +62,7 @@ contract CapabilityRegistry_RemoveNodesTest is BaseTest { bytes32[] memory nodes = new bytes32[](1); nodes[0] = INVALID_P2P_ID; - vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeP2PId.selector, INVALID_P2P_ID)); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.NodeDoesNotExist.selector, INVALID_P2P_ID)); s_capabilityRegistry.removeNodes(nodes); } @@ -71,7 +71,7 @@ contract CapabilityRegistry_RemoveNodesTest is BaseTest { bytes32[] memory nodes = new bytes32[](1); nodes[0] = bytes32(""); - vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeP2PId.selector, bytes32(""))); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.NodeDoesNotExist.selector, bytes32(""))); s_capabilityRegistry.removeNodes(nodes); } diff --git a/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodesTest.t.sol b/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodesTest.t.sol index a419f2c198e..da4e811c3ec 100644 --- a/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodesTest.t.sol +++ b/contracts/src/v0.8/keystone/test/CapabilityRegistry_UpdateNodesTest.t.sol @@ -75,7 +75,7 @@ contract CapabilityRegistry_UpdateNodesTest is BaseTest { hashedCapabilityIds: hashedCapabilityIds }); - vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeP2PId.selector, INVALID_P2P_ID)); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.NodeDoesNotExist.selector, INVALID_P2P_ID)); s_capabilityRegistry.updateNodes(nodes); } @@ -93,7 +93,7 @@ contract CapabilityRegistry_UpdateNodesTest is BaseTest { hashedCapabilityIds: hashedCapabilityIds }); - vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.InvalidNodeP2PId.selector, bytes32(""))); + vm.expectRevert(abi.encodeWithSelector(CapabilityRegistry.NodeDoesNotExist.selector, bytes32(""))); s_capabilityRegistry.updateNodes(nodes); } diff --git a/core/gethwrappers/keystone/generated/keystone_capability_registry/keystone_capability_registry.go b/core/gethwrappers/keystone/generated/keystone_capability_registry/keystone_capability_registry.go index ead693d88dd..b4796e04234 100644 --- a/core/gethwrappers/keystone/generated/keystone_capability_registry/keystone_capability_registry.go +++ b/core/gethwrappers/keystone/generated/keystone_capability_registry/keystone_capability_registry.go @@ -66,8 +66,8 @@ type CapabilityRegistryNodeOperator struct { } var CapabilityRegistryMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AccessForbidden\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityIsDeprecated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"DONDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONCapability\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONNode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedConfigurationContract\",\"type\":\"address\"}],\"name\":\"InvalidCapabilityConfigurationContractInterface\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"f\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"nodeCount\",\"type\":\"uint256\"}],\"name\":\"InvalidFaultTolerance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"InvalidNodeCapabilities\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeOperatorAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"InvalidNodeP2PId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"lengthOne\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lengthTwo\",\"type\":\"uint256\"}],\"name\":\"LengthMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"NodeDoesNotSupportCapability\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"NodeOperatorDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodePartOfDON\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDeprecated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"NodeOperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"}],\"name\":\"NodeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability[]\",\"name\":\"capabilities\",\"type\":\"tuple[]\"}],\"name\":\"addCapabilities\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"f\",\"type\":\"uint32\"}],\"name\":\"addDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"addNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"addNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"deprecateCapabilities\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilities\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"}],\"name\":\"getCapability\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"getCapabilityConfigs\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"getDON\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"f\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilityRegistry.DONInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDONs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"f\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilityRegistry.DONInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"name\":\"getHashedCapabilityId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"getNodeOperator\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeOperators\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo[]\",\"name\":\"nodeInfo\",\"type\":\"tuple[]\"},{\"internalType\":\"uint32[]\",\"name\":\"configCounts\",\"type\":\"uint32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"isCapabilityDeprecated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"donIds\",\"type\":\"uint32[]\"}],\"name\":\"removeDONs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"}],\"name\":\"removeNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"removedNodeP2PIds\",\"type\":\"bytes32[]\"}],\"name\":\"removeNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"f\",\"type\":\"uint32\"}],\"name\":\"updateDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"updateNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"updateNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6080604052600e80546001600160401b0319166401000000011790553480156200002857600080fd5b503380600081620000805760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000b357620000b381620000bc565b50505062000167565b336001600160a01b03821603620001165760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000077565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b614db080620001776000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80635d83d967116100ee57806386fa4246116100975780639cb7c5f4116100715780639cb7c5f4146103ea578063ddbe4f821461040a578063e29581aa1461041f578063f2fde38b1461043557600080fd5b806386fa42461461039c5780638da5cb5b146103af57806395864d1f146103d757600080fd5b8063715f5295116100c8578063715f52951461036e57806373ac22b41461038157806379ba50971461039457600080fd5b80635d83d967146103335780635e65e3091461034657806366acaa331461035957600080fd5b806322bdbcbc1161015b5780632c01a1e8116101355780632c01a1e8146102cb578063398f3773146102de5780633f2a13c9146102f157806350c946fe1461031257600080fd5b806322bdbcbc146102785780632353740514610298578063275459f2146102b857600080fd5b8063193ec0061161018c578063193ec0061461023b5780631d05394c14610250578063214502431461026357600080fd5b80630fe5800a146101b357806312570011146101d9578063181f5a77146101fc575b600080fd5b6101c66101c1366004613bce565b610448565b6040519081526020015b60405180910390f35b6101ec6101e7366004613c32565b61047c565b60405190151581526020016101d0565b604080518082018252601881527f4361706162696c697479526567697374727920312e302e300000000000000000602082015290516101d09190613cb9565b61024e610249366004613d38565b610489565b005b61024e61025e366004613ddd565b610553565b61026b61070f565b6040516101d09190613f47565b61028b610286366004613fc7565b610874565b6040516101d0919061401f565b6102ab6102a6366004613fc7565b610961565b6040516101d09190614032565b61024e6102c6366004613ddd565b6109a5565b61024e6102d9366004613ddd565b610a7c565b61024e6102ec366004613ddd565b610c9f565b6103046102ff366004614045565b610e67565b6040516101d092919061406f565b610325610320366004613c32565b611053565b6040516101d09291906140d6565b61024e610341366004613ddd565b6110f8565b61024e610354366004613ddd565b611246565b6103616116b8565b6040516101d091906140fe565b61024e61037c366004613ddd565b6118a3565b61024e61038f366004613ddd565b61195e565b61024e611dcf565b61024e6103aa366004614171565b611ecc565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d0565b61024e6103e53660046141dd565b612212565b6103fd6103f8366004613c32565b6122de565b6040516101d0919061434e565b6104126124e3565b6040516101d09190614361565b6104276127e1565b6040516101d09291906143d4565b61024e6104433660046144b7565b612950565b6000828260405160200161045d92919061406f565b6040516020818303038152906040528051906020012090505b92915050565b6000610476600583612964565b61049161297f565b600e805460009164010000000090910463ffffffff169060046104b383614501565b82546101009290920a63ffffffff8181021990931691831602179091558181166000818152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001684179055815160a0810183529283526001908301528715159082015285151560608201529084166080820152909150610549908990899089908990612a02565b5050505050505050565b61055b61297f565b60005b8181101561070a57600083838381811061057a5761057a614524565b905060200201602081019061058f9190613fc7565b63ffffffff8082166000908152600d60209081526040808320805464010000000090049094168084526001850190925282209394509192905b6105d1826130b2565b811015610629576106188563ffffffff16600c60006105f985876130bc90919063ffffffff16565b81526020019081526020016000206004016130c890919063ffffffff16565b5061062281614553565b90506105c8565b508254640100000000900463ffffffff16600003610680576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff851660048201526024015b60405180910390fd5b63ffffffff84166000818152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffff00000000000000000000000000001690558051938452908301919091527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a1505050508061070390614553565b905061055e565b505050565b600e54606090640100000000900463ffffffff16600061073060018361458b565b63ffffffff1667ffffffffffffffff81111561074e5761074e613a68565b6040519080825280602002602001820160405280156107d557816020015b6040805160e081018252600080825260208083018290529282018190526060808301829052608083019190915260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161076c5790505b509050600060015b8363ffffffff168163ffffffff1610156108515763ffffffff8082166000908152600d6020526040902054161561084157610817816130d4565b83838151811061082957610829614524565b60200260200101819052508161083e90614553565b91505b61084a81614501565b90506107dd565b5061085d60018461458b565b63ffffffff16811461086d578082525b5092915050565b60408051808201909152600081526060602082015263ffffffff82166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff16835260018101805491928401916108d8906145a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610904906145a8565b80156109515780601f1061092657610100808354040283529160200191610951565b820191906000526020600020905b81548152906001019060200180831161093457829003601f168201915b5050505050815250509050919050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c0810191909152610476826130d4565b6109ad61297f565b60005b63ffffffff811682111561070a57600083838363ffffffff168181106109d8576109d8614524565b90506020020160208101906109ed9190613fc7565b63ffffffff81166000908152600b6020526040812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155919250610a3860018301826139fb565b505060405163ffffffff8216907fa59268ca81d40429e65ccea5385b59cf2d3fc6519371dee92f8eb1dae5107a7a90600090a250610a7581614501565b90506109b0565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c99576000848483818110610ab657610ab6614524565b602090810292909201356000818152600c90935260409092206001810154929350919050610b13576040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260048101839052602401610677565b6000610b21826004016130b2565b1115610b5c576040517f34a4a3f600000000000000000000000000000000000000000000000000000000815260048101839052602401610677565b83158015610b965750805463ffffffff166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610bcf576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610677565b6001810154610be0906007906130c8565b506002810154610bf2906009906130c8565b506000828152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016815560018101829055600281018290559060048201818181610c478282613a35565b5050505050507f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320582604051610c7e91815260200190565b60405180910390a1505080610c9290614553565b9050610a9a565b50505050565b610ca761297f565b60005b8181101561070a576000838383818110610cc657610cc6614524565b9050602002810190610cd891906145fb565b610ce190614639565b805190915073ffffffffffffffffffffffffffffffffffffffff16610d32576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815263ffffffff9095166000818152600b909252939020825181547fffffffffffffffffffffffff00000000000000000000000000000000000000001692169190911781559251919290916001820190610dbe90826146f1565b5050600e8054909150600090610dd99063ffffffff16614501565b91906101000a81548163ffffffff021916908363ffffffff160217905550816000015173ffffffffffffffffffffffffffffffffffffffff168163ffffffff167f78e94ca80be2c30abc061b99e7eb8583b1254781734b1e3ce339abb57da2fe8e8460200151604051610e4c9190613cb9565b60405180910390a3505080610e6090614553565b9050610caa565b63ffffffff8083166000908152600d60209081526040808320805464010000000090049094168084526001909401825280832085845260030190915281208054606093849390929091610eb9906145a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee5906145a8565b8015610f325780601f10610f0757610100808354040283529160200191610f32565b820191906000526020600020905b815481529060010190602001808311610f1557829003601f168201915b5050506000888152600260208190526040909120015492935060609262010000900473ffffffffffffffffffffffffffffffffffffffff16159150611045905057600086815260026020819052604091829020015490517f8318ed5d00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526201000090910473ffffffffffffffffffffffffffffffffffffffff1690638318ed5d90602401600060405180830381865afa158015610ffc573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611042919081019061480b565b90505b9093509150505b9250929050565b6040805160808101825260008082526020820181905291810191909152606080820152604080516080810182526000848152600c6020908152838220805463ffffffff8082168652600183015484870152600283015486880152640100000000909104168352600301905291822060608201906110cf906133b0565b90526000938452600c602052604090932054929364010000000090930463ffffffff1692915050565b61110061297f565b60005b8181101561070a57600083838381811061111f5761111f614524565b90506020020135905061113c81600361296490919063ffffffff16565b611175576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610677565b6111806005826133bd565b6111b9576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610677565b6000818152600260205260408120906111d282826139fb565b6111e06001830160006139fb565b5060020180547fffffffffffffffffffff0000000000000000000000000000000000000000000016905560405181907fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2190600090a25061123f81614553565b9050611103565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c9957600084848381811061128057611280614524565b90506020028101906112929190614879565b61129b906148ad565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549596509394919390928401916112f1906145a8565b80601f016020809104026020016040519081016040528092919081815260200182805461131d906145a8565b801561136a5780601f1061133f5761010080835404028352916020019161136a565b820191906000526020600020905b81548152906001019060200180831161134d57829003601f168201915b50505050508152505090508315801561139a5750805173ffffffffffffffffffffffffffffffffffffffff163314155b156113d3576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610677565b6040808301516000908152600c6020522060018101546114275782604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161067791815260200190565b60208301511580611457575082602001518160010154141580156114575750602083015161145790600790612964565b1561148e576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606083015180516000036114d057806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106779190614980565b8154640100000000900463ffffffff168260046114ec83614501565b82546101009290920a63ffffffff8181021990931691831602179091558354640100000000900416905060005b82518110156115e45761154f83828151811061153757611537614524565b6020026020010151600361296490919063ffffffff16565b61158757826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106779190614980565b6115d383828151811061159c5761159c614524565b60200260200101518560030160008563ffffffff1663ffffffff1681526020019081526020016000206133bd90919063ffffffff16565b506115dd81614553565b9050611519565b50845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff909116178355604085015160028401556001830154602086015181146116565761163b6007826130c8565b50602086015160018501819055611654906007906133bd565b505b85516040808801516020808a015183519283529082015263ffffffff909216917f4b5b465e22eea0c3d40c30e936643245b80d19b2dcf75788c0699fe8d8db645b910160405180910390a2505050505050806116b190614553565b9050611264565b600e5460609063ffffffff1660006116d160018361458b565b63ffffffff1667ffffffffffffffff8111156116ef576116ef613a68565b60405190808252806020026020018201604052801561173557816020015b60408051808201909152600081526060602082015281526020019060019003908161170d5790505b509050600060015b8363ffffffff168163ffffffff16101561188d5763ffffffff81166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff161561187d5763ffffffff81166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff16835260018101805491928401916117d1906145a8565b80601f01602080910402602001604051908101604052809291908181526020018280546117fd906145a8565b801561184a5780601f1061181f5761010080835404028352916020019161184a565b820191906000526020600020905b81548152906001019060200180831161182d57829003601f168201915b50505050508152505083838151811061186557611865614524565b60200260200101819052508161187a90614553565b91505b61188681614501565b905061173d565b50600e5461085d9060019063ffffffff1661458b565b6118ab61297f565b60005b8181101561070a5760008383838181106118ca576118ca614524565b90506020028101906118dc9190614993565b6118e5906149d6565b905060006118fb82600001518360200151610448565b90506119086003826133bd565b611941576040517febf5255100000000000000000000000000000000000000000000000000000000815260048101829052602401610677565b61194b81836133c9565b50508061195790614553565b90506118ae565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c9957600084848381811061199857611998614524565b90506020028101906119aa9190614879565b6119b3906148ad565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff168252600181018054959650939491939092840191611a09906145a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611a35906145a8565b8015611a825780601f10611a5757610100808354040283529160200191611a82565b820191906000526020600020905b815481529060010190602001808311611a6557829003601f168201915b50505091909252505081519192505073ffffffffffffffffffffffffffffffffffffffff16611ae85781516040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff9091166004820152602401610677565b83158015611b0d5750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611b46576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610677565b6040808301516000908152600c602052206001810154151580611b6b57506040830151155b15611baa5782604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161067791815260200190565b60208301511580611bc757506020830151611bc790600790612964565b15611bfe576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608301518051600003611c4057806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106779190614980565b81548290600490611c5e90640100000000900463ffffffff16614501565b82546101009290920a63ffffffff818102199093169183160217909155825464010000000090041660005b8251811015611d0557611ca783828151811061153757611537614524565b611cdf57826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106779190614980565b611cf483828151811061159c5761159c614524565b50611cfe81614553565b9050611c89565b50845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff91821617845560408601516002850155602086015160018501819055611d5b91600791906133bd16565b506040850151611d6d906009906133bd565b50845160408087015160208089015183519283529082015263ffffffff909216917f74becb12a5e8fd0e98077d02dfba8f647c9670c9df177e42c2418cf17a636f05910160405180910390a2505050505080611dc890614553565b905061197c565b60015473ffffffffffffffffffffffffffffffffffffffff163314611e50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610677565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b828114611f0f576040517fab8b67c60000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610677565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b8481101561220a576000868683818110611f4757611f47614524565b9050602002016020810190611f5c9190613fc7565b63ffffffff81166000908152600b6020526040902080549192509073ffffffffffffffffffffffffffffffffffffffff16611fcb576040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff83166004820152602401610677565b6000868685818110611fdf57611fdf614524565b9050602002810190611ff191906145fb565b611ffa90614639565b805190915073ffffffffffffffffffffffffffffffffffffffff1661204b576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff16331480159061208857503373ffffffffffffffffffffffffffffffffffffffff861614155b156120c1576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610677565b8051825473ffffffffffffffffffffffffffffffffffffffff908116911614158061213d57506020808201516040516120fa9201613cb9565b60405160208183030381529060405280519060200120826001016040516020016121249190614a7c565b6040516020818303038152906040528051906020012014155b156121f657805182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020810151600183019061219790826146f1565b50806000015173ffffffffffffffffffffffffffffffffffffffff168363ffffffff167f86f41145bde5dd7f523305452e4aad3685508c181432ec733d5f345009358a2883602001516040516121ed9190613cb9565b60405180910390a35b5050508061220390614553565b9050611f2b565b505050505050565b61221a61297f565b63ffffffff8089166000908152600d602052604081205464010000000090049091169081900361227e576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff8a166004820152602401610677565b6122d3888888886040518060a001604052808f63ffffffff168152602001876122a690614501565b97508763ffffffff1681526020018a1515815260200189151581526020018863ffffffff16815250612a02565b505050505050505050565b61230e6040805160a081018252606080825260208201529081016000815260200160008152600060209091015290565b60008281526002602052604090819020815160a08101909252805482908290612336906145a8565b80601f0160208091040260200160405190810160405280929190818152602001828054612362906145a8565b80156123af5780601f10612384576101008083540402835291602001916123af565b820191906000526020600020905b81548152906001019060200180831161239257829003601f168201915b505050505081526020016001820180546123c8906145a8565b80601f01602080910402602001604051908101604052809291908181526020018280546123f4906145a8565b80156124415780601f1061241657610100808354040283529160200191612441565b820191906000526020600020905b81548152906001019060200180831161242457829003601f168201915b5050509183525050600282015460209091019060ff16600381111561246857612468614292565b600381111561247957612479614292565b81526020016002820160019054906101000a900460ff1660018111156124a1576124a1614292565b60018111156124b2576124b2614292565b81526002919091015462010000900473ffffffffffffffffffffffffffffffffffffffff1660209091015292915050565b606060006124f160036133b0565b905060006124ff60056130b2565b825161250b9190614b25565b67ffffffffffffffff81111561252357612523613a68565b60405190808252806020026020018201604052801561258457816020015b6125716040805160a081018252606080825260208201529081016000815260200160008152600060209091015290565b8152602001906001900390816125415790505b5090506000805b83518110156127d85760008482815181106125a8576125a8614524565b602002602001015190506125c681600561296490919063ffffffff16565b6127c75760008181526002602052604090819020815160a081019092528054829082906125f2906145a8565b80601f016020809104026020016040519081016040528092919081815260200182805461261e906145a8565b801561266b5780601f106126405761010080835404028352916020019161266b565b820191906000526020600020905b81548152906001019060200180831161264e57829003601f168201915b50505050508152602001600182018054612684906145a8565b80601f01602080910402602001604051908101604052809291908181526020018280546126b0906145a8565b80156126fd5780601f106126d2576101008083540402835291602001916126fd565b820191906000526020600020905b8154815290600101906020018083116126e057829003601f168201915b5050509183525050600282015460209091019060ff16600381111561272457612724614292565b600381111561273557612735614292565b81526020016002820160019054906101000a900460ff16600181111561275d5761275d614292565b600181111561276e5761276e614292565b81526002919091015462010000900473ffffffffffffffffffffffffffffffffffffffff1660209091015284518590859081106127ad576127ad614524565b602002602001018190525082806127c390614553565b9350505b506127d181614553565b905061258b565b50909392505050565b60608060006127f060096133b0565b9050805167ffffffffffffffff81111561280c5761280c613a68565b60405190808252806020026020018201604052801561287b57816020015b60408051608081018252600080825260208083018290529282015260608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161282a5790505b509250805167ffffffffffffffff81111561289857612898613a68565b6040519080825280602002602001820160405280156128c1578160200160208202803683370190505b50915060005b815181101561294a576128f28282815181106128e5576128e5614524565b6020026020010151611053565b85838151811061290457612904614524565b6020026020010185848151811061291d5761291d614524565b602002602001018263ffffffff1663ffffffff1681525082905250508061294390614553565b90506128c7565b50509091565b61295861297f565b6129618161365d565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612a00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610677565b565b805163ffffffff9081166000908152600d602090815260408083208286015185168452600101909152902060808301519091161580612a56575060808201518590612a4e906001614b38565b63ffffffff16115b15612aa25760808201516040517fd5f5269100000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101869052604401610677565b6001826020015163ffffffff161115612b4e57815163ffffffff166000908152600d602090815260408220908401516001918201918391612ae3919061458b565b63ffffffff1663ffffffff168152602001908152602001600020905060005b612b0b826130b2565b811015612b4b57612b3a846000015163ffffffff16600c60006105f985876000016130bc90919063ffffffff16565b50612b4481614553565b9050612b02565b50505b60005b85811015612c3857612b7e878783818110612b6e57612b6e614524565b85926020909102013590506133bd565b612bdf578251878783818110612b9657612b96614524565b6040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff90941660048501526020029190910135602483015250604401610677565b8251612c279063ffffffff16600c60008a8a86818110612c0157612c01614524565b9050602002013581526020019081526020016000206004016133bd90919063ffffffff16565b50612c3181614553565b9050612b51565b5060005b83811015612f245736858583818110612c5757612c57614524565b9050602002810190612c6991906145fb565b9050612c7760038235612964565b612cb0576040517fe181733f00000000000000000000000000000000000000000000000000000000815281356004820152602401610677565b612cbc60058235612964565b15612cf6576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815281356004820152602401610677565b8035600090815260038401602052604081208054612d13906145a8565b90501115612d5f5783516040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015281356024820152604401610677565b60005b87811015612e7157612e068235600c60008c8c86818110612d8557612d85614524565b9050602002013581526020019081526020016000206003016000600c60008e8e88818110612db557612db5614524565b90506020020135815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002061296490919063ffffffff16565b612e6157888882818110612e1c57612e1c614524565b6040517fa7e792500000000000000000000000000000000000000000000000000000000081526020909102929092013560048301525082356024820152604401610677565b612e6a81614553565b9050612d62565b5060028301805460018101825560009182526020918290208335910155612e9a90820182614b55565b82356000908152600386016020526040902091612eb8919083614bba565b508351602080860151612f1392918435908c908c90612ed990880188614b55565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061375292505050565b50612f1d81614553565b9050612c3c565b50604080830151835163ffffffff9081166000908152600d602090815284822080549415156c01000000000000000000000000027fffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff90951694909417909355606086015186518316825284822080549115156d0100000000000000000000000000027fffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff9092169190911790556080860151865183168252848220805491841668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff909216919091179055918501805186518316845292849020805493909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9093169290921790558351905191517ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651926130a2929163ffffffff92831681529116602082015260400190565b60405180910390a1505050505050565b6000610476825490565b60006129788383613833565b6000612978838361385d565b6040805160e0810182526000808252602080830182905282840182905260608084018390526080840183905260a0840181905260c084015263ffffffff8581168352600d825284832080546401000000009004909116808452600190910182528483206002810180548751818602810186019098528088529596929591949390919083018282801561318557602002820191906000526020600020905b815481526020019060010190808311613171575b505050505090506000815167ffffffffffffffff8111156131a8576131a8613a68565b6040519080825280602002602001820160405280156131ee57816020015b6040805180820190915260008152606060208201528152602001906001900390816131c65790505b50905060005b815181101561330f57604051806040016040528084838151811061321a5761321a614524565b6020026020010151815260200185600301600086858151811061323f5761323f614524565b602002602001015181526020019081526020016000208054613260906145a8565b80601f016020809104026020016040519081016040528092919081815260200182805461328c906145a8565b80156132d95780601f106132ae576101008083540402835291602001916132d9565b820191906000526020600020905b8154815290600101906020018083116132bc57829003601f168201915b50505050508152508282815181106132f3576132f3614524565b60200260200101819052508061330890614553565b90506131f4565b506040805160e08101825263ffffffff8089166000818152600d60208181528683205480861687528b8616828801526801000000000000000081049095169686019690965260ff6c010000000000000000000000008504811615156060870152929091529093526d010000000000000000000000000090049091161515608082015260a0810161339e856133b0565b81526020019190915295945050505050565b6060600061297883613950565b600061297883836139ac565b608081015173ffffffffffffffffffffffffffffffffffffffff161561351757608081015173ffffffffffffffffffffffffffffffffffffffff163b15806134c2575060808101516040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f78bea72100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff909116906301ffc9a790602401602060405180830381865afa15801561349c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c09190614cd5565b155b156135175760808101516040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610677565b60008281526002602052604090208151829190819061353690826146f1565b506020820151600182019061354b90826146f1565b5060408201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600381111561358d5761358d614292565b021790555060608201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101008360018111156135d4576135d4614292565b0217905550608091909101516002909101805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff90921691909117905560405182907f04f0a9bcf3f3a3b42a4d7ca081119755f82ebe43e0d30c8f7292c4fe0dc4a2ae90600090a25050565b3373ffffffffffffffffffffffffffffffffffffffff8216036136dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610677565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000848152600260208190526040909120015462010000900473ffffffffffffffffffffffffffffffffffffffff161561220a57600084815260026020819052604091829020015490517ffba64a7c0000000000000000000000000000000000000000000000000000000081526201000090910473ffffffffffffffffffffffffffffffffffffffff169063fba64a7c906137f9908690869086908b908d90600401614cf2565b600060405180830381600087803b15801561381357600080fd5b505af1158015613827573d6000803e3d6000fd5b50505050505050505050565b600082600001828154811061384a5761384a614524565b9060005260206000200154905092915050565b60008181526001830160205260408120548015613946576000613881600183614b25565b855490915060009061389590600190614b25565b90508181146138fa5760008660000182815481106138b5576138b5614524565b90600052602060002001549050808760000184815481106138d8576138d8614524565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061390b5761390b614d74565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610476565b6000915050610476565b6060816000018054806020026020016040519081016040528092919081815260200182805480156139a057602002820191906000526020600020905b81548152602001906001019080831161398c575b50505050509050919050565b60008181526001830160205260408120546139f357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610476565b506000610476565b508054613a07906145a8565b6000825580601f10613a17575050565b601f0160209004906000526020600020908101906129619190613a4f565b508054600082559060005260206000209081019061296191905b5b80821115613a645760008155600101613a50565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613aba57613aba613a68565b60405290565b60405160a0810167ffffffffffffffff81118282101715613aba57613aba613a68565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613b2a57613b2a613a68565b604052919050565b600067ffffffffffffffff821115613b4c57613b4c613a68565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613b8957600080fd5b8135613b9c613b9782613b32565b613ae3565b818152846020838601011115613bb157600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215613be157600080fd5b823567ffffffffffffffff80821115613bf957600080fd5b613c0586838701613b78565b93506020850135915080821115613c1b57600080fd5b50613c2885828601613b78565b9150509250929050565b600060208284031215613c4457600080fd5b5035919050565b60005b83811015613c66578181015183820152602001613c4e565b50506000910152565b60008151808452613c87816020860160208601613c4b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006129786020830184613c6f565b60008083601f840112613cde57600080fd5b50813567ffffffffffffffff811115613cf657600080fd5b6020830191508360208260051b850101111561104c57600080fd5b801515811461296157600080fd5b803563ffffffff81168114613d3357600080fd5b919050565b600080600080600080600060a0888a031215613d5357600080fd5b873567ffffffffffffffff80821115613d6b57600080fd5b613d778b838c01613ccc565b909950975060208a0135915080821115613d9057600080fd5b50613d9d8a828b01613ccc565b9096509450506040880135613db181613d11565b92506060880135613dc181613d11565b9150613dcf60808901613d1f565b905092959891949750929550565b60008060208385031215613df057600080fd5b823567ffffffffffffffff811115613e0757600080fd5b613e1385828601613ccc565b90969095509350505050565b600081518084526020808501945080840160005b83811015613e4f57815187529582019590820190600101613e33565b509495945050505050565b600063ffffffff80835116845260208181850151168186015260408281860151168187015260608501511515606087015260808501511515608087015260a0850151925060e060a0870152613eb260e0870184613e1f565b925060c085015186840360c08801528381518086528486019150848160051b870101858401935060005b82811015613f39578782037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018452845180518352870151878301879052613f2687840182613c6f565b9588019594880194925050600101613edc565b509998505050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613fba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613fa8858351613e5a565b94509285019290850190600101613f6e565b5092979650505050505050565b600060208284031215613fd957600080fd5b61297882613d1f565b73ffffffffffffffffffffffffffffffffffffffff815116825260006020820151604060208501526140176040850182613c6f565b949350505050565b6020815260006129786020830184613fe2565b6020815260006129786020830184613e5a565b6000806040838503121561405857600080fd5b61406183613d1f565b946020939093013593505050565b6040815260006140826040830185613c6f565b82810360208401526140948185613c6f565b95945050505050565b63ffffffff8151168252602081015160208301526040810151604083015260006060820151608060608501526140176080850182613e1f565b6040815260006140e9604083018561409d565b905063ffffffff831660208301529392505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613fba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261415f858351613fe2565b94509285019290850190600101614125565b6000806000806040858703121561418757600080fd5b843567ffffffffffffffff8082111561419f57600080fd5b6141ab88838901613ccc565b909650945060208701359150808211156141c457600080fd5b506141d187828801613ccc565b95989497509550505050565b60008060008060008060008060c0898b0312156141f957600080fd5b61420289613d1f565b9750602089013567ffffffffffffffff8082111561421f57600080fd5b61422b8c838d01613ccc565b909950975060408b013591508082111561424457600080fd5b506142518b828c01613ccc565b909650945050606089013561426581613d11565b9250608089013561427581613d11565b915061428360a08a01613d1f565b90509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000815160a084526142d660a0850182613c6f565b9050602083015184820360208601526142ef8282613c6f565b91505060408301516004811061430757614307614292565b604085015260608301516002811061432157614321614292565b606085015260809283015173ffffffffffffffffffffffffffffffffffffffff1692909301919091525090565b60208152600061297860208301846142c1565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613fba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526143c28583516142c1565b94509285019290850190600101614388565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b83811015614449577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa088870301855261443786835161409d565b955093820193908201906001016143fd565b50508584038187015286518085528782019482019350915060005b8281101561448657845163ffffffff1684529381019392810192600101614464565b5091979650505050505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613d3357600080fd5b6000602082840312156144c957600080fd5b61297882614493565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff80831681810361451a5761451a6144d2565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614584576145846144d2565b5060010190565b63ffffffff82811682821603908082111561086d5761086d6144d2565b600181811c908216806145bc57607f821691505b6020821081036145f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261462f57600080fd5b9190910192915050565b60006040823603121561464b57600080fd5b6040516040810167ffffffffffffffff828210818311171561466f5761466f613a68565b8160405261467c85614493565b8352602085013591508082111561469257600080fd5b5061469f36828601613b78565b60208301525092915050565b601f82111561070a57600081815260208120601f850160051c810160208610156146d25750805b601f850160051c820191505b8181101561220a578281556001016146de565b815167ffffffffffffffff81111561470b5761470b613a68565b61471f8161471984546145a8565b846146ab565b602080601f831160018114614772576000841561473c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561220a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156147bf578886015182559484019460019091019084016147a0565b50858210156147fb57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561481d57600080fd5b815167ffffffffffffffff81111561483457600080fd5b8201601f8101841361484557600080fd5b8051614853613b9782613b32565b81815285602083850101111561486857600080fd5b614094826020830160208601613c4b565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8183360301811261462f57600080fd5b6000608082360312156148bf57600080fd5b6148c7613a97565b6148d083613d1f565b81526020808401358183015260408401356040830152606084013567ffffffffffffffff8082111561490157600080fd5b9085019036601f83011261491457600080fd5b81358181111561492657614926613a68565b8060051b9150614937848301613ae3565b818152918301840191848101903684111561495157600080fd5b938501935b8385101561496f57843582529385019390850190614956565b606087015250939695505050505050565b6020815260006129786020830184613e1f565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6183360301811261462f57600080fd5b803560028110613d3357600080fd5b600060a082360312156149e857600080fd5b6149f0613ac0565b823567ffffffffffffffff80821115614a0857600080fd5b614a1436838701613b78565b83526020850135915080821115614a2a57600080fd5b50614a3736828601613b78565b602083015250604083013560048110614a4f57600080fd5b6040820152614a60606084016149c7565b6060820152614a7160808401614493565b608082015292915050565b6000602080835260008454614a90816145a8565b80848701526040600180841660008114614ab15760018114614ae957614b17565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550614b17565b896000528660002060005b85811015614b0f5781548b8201860152908301908801614af4565b8a0184019650505b509398975050505050505050565b81810381811115610476576104766144d2565b63ffffffff81811683821601908082111561086d5761086d6144d2565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614b8a57600080fd5b83018035915067ffffffffffffffff821115614ba557600080fd5b60200191503681900382131561104c57600080fd5b67ffffffffffffffff831115614bd257614bd2613a68565b614be683614be083546145a8565b836146ab565b6000601f841160018114614c385760008515614c025750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614cce565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015614c875786850135825560209485019460019092019101614c67565b5086821015614cc2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b600060208284031215614ce757600080fd5b815161297881613d11565b6080815284608082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115614d2b57600080fd5b8560051b808860a0850137820182810360a09081016020850152614d5190820187613c6f565b91505063ffffffff80851660408401528084166060840152509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AccessForbidden\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityIsDeprecated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"DONDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONCapability\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"DuplicateDONNode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedConfigurationContract\",\"type\":\"address\"}],\"name\":\"InvalidCapabilityConfigurationContractInterface\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"f\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"nodeCount\",\"type\":\"uint256\"}],\"name\":\"InvalidFaultTolerance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"InvalidNodeCapabilities\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeOperatorAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"InvalidNodeP2PId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidNodeSigner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"lengthOne\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lengthTwo\",\"type\":\"uint256\"}],\"name\":\"LengthMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodeAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodeDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"NodeDoesNotSupportCapability\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"NodeOperatorDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"nodeP2PId\",\"type\":\"bytes32\"}],\"name\":\"NodePartOfDON\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"CapabilityDeprecated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"}],\"name\":\"NodeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"NodeOperatorRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NodeOperatorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"}],\"name\":\"NodeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability[]\",\"name\":\"capabilities\",\"type\":\"tuple[]\"}],\"name\":\"addCapabilities\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"f\",\"type\":\"uint32\"}],\"name\":\"addDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"addNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"addNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"name\":\"deprecateCapabilities\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilities\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedId\",\"type\":\"bytes32\"}],\"name\":\"getCapability\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityType\",\"name\":\"capabilityType\",\"type\":\"uint8\"},{\"internalType\":\"enumCapabilityRegistry.CapabilityResponseType\",\"name\":\"responseType\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"configurationContract\",\"type\":\"address\"}],\"internalType\":\"structCapabilityRegistry.Capability\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"}],\"name\":\"getCapabilityConfigs\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"getDON\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"f\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilityRegistry.DONInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDONs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"id\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"f\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodeP2PIds\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"}],\"internalType\":\"structCapabilityRegistry.DONInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"labelledName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"name\":\"getHashedCapabilityId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"getNode\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"}],\"name\":\"getNodeOperator\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodeOperators\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNodes\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo[]\",\"name\":\"nodeInfo\",\"type\":\"tuple[]\"},{\"internalType\":\"uint32[]\",\"name\":\"configCounts\",\"type\":\"uint32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashedCapabilityId\",\"type\":\"bytes32\"}],\"name\":\"isCapabilityDeprecated\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"donIds\",\"type\":\"uint32[]\"}],\"name\":\"removeDONs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"}],\"name\":\"removeNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"removedNodeP2PIds\",\"type\":\"bytes32[]\"}],\"name\":\"removeNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32[]\",\"name\":\"nodes\",\"type\":\"bytes32[]\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"capabilityId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCapabilityRegistry.CapabilityConfiguration[]\",\"name\":\"capabilityConfigurations\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isPublic\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"acceptsWorkflows\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"f\",\"type\":\"uint32\"}],\"name\":\"updateDON\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32[]\",\"name\":\"nodeOperatorIds\",\"type\":\"uint32[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"internalType\":\"structCapabilityRegistry.NodeOperator[]\",\"name\":\"nodeOperators\",\"type\":\"tuple[]\"}],\"name\":\"updateNodeOperators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nodeOperatorId\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"signer\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[]\",\"name\":\"hashedCapabilityIds\",\"type\":\"bytes32[]\"}],\"internalType\":\"structCapabilityRegistry.NodeInfo[]\",\"name\":\"nodes\",\"type\":\"tuple[]\"}],\"name\":\"updateNodes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6080604052600e80546001600160401b0319166401000000011790553480156200002857600080fd5b503380600081620000805760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000b357620000b381620000bc565b50505062000167565b336001600160a01b03821603620001165760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000077565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b614e6f80620001776000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80635d83d967116100ee57806386fa4246116100975780639cb7c5f4116100715780639cb7c5f4146103ea578063ddbe4f821461040a578063e29581aa14610420578063f2fde38b1461043657600080fd5b806386fa42461461039c5780638da5cb5b146103af57806395864d1f146103d757600080fd5b8063715f5295116100c8578063715f52951461036e57806373ac22b41461038157806379ba50971461039457600080fd5b80635d83d967146103335780635e65e3091461034657806366acaa331461035957600080fd5b806322bdbcbc1161015b5780632c01a1e8116101355780632c01a1e8146102cb578063398f3773146102de5780633f2a13c9146102f157806350c946fe1461031257600080fd5b806322bdbcbc146102785780632353740514610298578063275459f2146102b857600080fd5b8063193ec0061161018c578063193ec0061461023b5780631d05394c14610250578063214502431461026357600080fd5b80630fe5800a146101b357806312570011146101d9578063181f5a77146101fc575b600080fd5b6101c66101c1366004613c70565b610449565b6040519081526020015b60405180910390f35b6101ec6101e7366004613cd4565b61047d565b60405190151581526020016101d0565b604080518082018252601881527f4361706162696c697479526567697374727920312e302e300000000000000000602082015290516101d09190613d5b565b61024e610249366004613dda565b61048a565b005b61024e61025e366004613e7f565b610554565b61026b610710565b6040516101d09190613fe9565b61028b610286366004614069565b610875565b6040516101d091906140c1565b6102ab6102a6366004614069565b610962565b6040516101d091906140d4565b61024e6102c6366004613e7f565b6109a6565b61024e6102d9366004613e7f565b610a7d565b61024e6102ec366004613e7f565b610ca0565b6103046102ff3660046140e7565b610e68565b6040516101d0929190614111565b610325610320366004613cd4565b611054565b6040516101d0929190614178565b61024e610341366004613e7f565b6110f9565b61024e610354366004613e7f565b611247565b6103616116b9565b6040516101d091906141a0565b61024e61037c366004613e7f565b6118a4565b61024e61038f366004613e7f565b61195f565b61024e611e04565b61024e6103aa366004614213565b611f01565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d0565b61024e6103e536600461427f565b612247565b6103fd6103f8366004613cd4565b612313565b6040516101d091906143f0565b610412612518565b6040516101d0929190614403565b610428612883565b6040516101d0929190614493565b61024e610444366004614576565b6129f2565b6000828260405160200161045e929190614111565b6040516020818303038152906040528051906020012090505b92915050565b6000610477600583612a06565b610492612a21565b600e805460009164010000000090910463ffffffff169060046104b4836145c0565b82546101009290920a63ffffffff8181021990931691831602179091558181166000818152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001684179055815160a081018352928352600190830152871515908201528515156060820152908416608082015290915061054a908990899089908990612aa4565b5050505050505050565b61055c612a21565b60005b8181101561070b57600083838381811061057b5761057b6145e3565b90506020020160208101906105909190614069565b63ffffffff8082166000908152600d60209081526040808320805464010000000090049094168084526001850190925282209394509192905b6105d282613154565b81101561062a576106198563ffffffff16600c60006105fa858761315e90919063ffffffff16565b815260200190815260200160002060040161316a90919063ffffffff16565b5061062381614612565b90506105c9565b508254640100000000900463ffffffff16600003610681576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff851660048201526024015b60405180910390fd5b63ffffffff84166000818152600d6020908152604080832080547fffffffffffffffffffffffffffffffffffff00000000000000000000000000001690558051938452908301919091527ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c1581703651910160405180910390a1505050508061070490614612565b905061055f565b505050565b600e54606090640100000000900463ffffffff16600061073160018361464a565b63ffffffff1667ffffffffffffffff81111561074f5761074f613b0a565b6040519080825280602002602001820160405280156107d657816020015b6040805160e081018252600080825260208083018290529282018190526060808301829052608083019190915260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161076d5790505b509050600060015b8363ffffffff168163ffffffff1610156108525763ffffffff8082166000908152600d602052604090205416156108425761081881613176565b83838151811061082a5761082a6145e3565b60200260200101819052508161083f90614612565b91505b61084b816145c0565b90506107de565b5061085e60018461464a565b63ffffffff16811461086e578082525b5092915050565b60408051808201909152600081526060602082015263ffffffff82166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff16835260018101805491928401916108d990614667565b80601f016020809104026020016040519081016040528092919081815260200182805461090590614667565b80156109525780601f1061092757610100808354040283529160200191610952565b820191906000526020600020905b81548152906001019060200180831161093557829003601f168201915b5050505050815250509050919050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810182905260c081019190915261047782613176565b6109ae612a21565b60005b63ffffffff811682111561070b57600083838363ffffffff168181106109d9576109d96145e3565b90506020020160208101906109ee9190614069565b63ffffffff81166000908152600b6020526040812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155919250610a396001830182613a9d565b505060405163ffffffff8216907fa59268ca81d40429e65ccea5385b59cf2d3fc6519371dee92f8eb1dae5107a7a90600090a250610a76816145c0565b90506109b1565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c9a576000848483818110610ab757610ab76145e3565b602090810292909201356000818152600c90935260409092206001810154929350919050610b14576040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260048101839052602401610678565b6000610b2282600401613154565b1115610b5d576040517f34a4a3f600000000000000000000000000000000000000000000000000000000815260048101839052602401610678565b83158015610b975750805463ffffffff166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610bd0576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610678565b6001810154610be19060079061316a565b506002810154610bf39060099061316a565b506000828152600c6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016815560018101829055600281018290559060048201818181610c488282613ad7565b5050505050507f5254e609a97bab37b7cc79fe128f85c097bd6015c6e1624ae0ba392eb975320582604051610c7f91815260200190565b60405180910390a1505080610c9390614612565b9050610a9b565b50505050565b610ca8612a21565b60005b8181101561070b576000838383818110610cc757610cc76145e3565b9050602002810190610cd991906146ba565b610ce2906146f8565b805190915073ffffffffffffffffffffffffffffffffffffffff16610d33576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e54604080518082018252835173ffffffffffffffffffffffffffffffffffffffff908116825260208086015181840190815263ffffffff9095166000818152600b909252939020825181547fffffffffffffffffffffffff00000000000000000000000000000000000000001692169190911781559251919290916001820190610dbf90826147b0565b5050600e8054909150600090610dda9063ffffffff166145c0565b91906101000a81548163ffffffff021916908363ffffffff160217905550816000015173ffffffffffffffffffffffffffffffffffffffff168163ffffffff167f78e94ca80be2c30abc061b99e7eb8583b1254781734b1e3ce339abb57da2fe8e8460200151604051610e4d9190613d5b565b60405180910390a3505080610e6190614612565b9050610cab565b63ffffffff8083166000908152600d60209081526040808320805464010000000090049094168084526001909401825280832085845260030190915281208054606093849390929091610eba90614667565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee690614667565b8015610f335780601f10610f0857610100808354040283529160200191610f33565b820191906000526020600020905b815481529060010190602001808311610f1657829003601f168201915b5050506000888152600260208190526040909120015492935060609262010000900473ffffffffffffffffffffffffffffffffffffffff16159150611046905057600086815260026020819052604091829020015490517f8318ed5d00000000000000000000000000000000000000000000000000000000815263ffffffff891660048201526201000090910473ffffffffffffffffffffffffffffffffffffffff1690638318ed5d90602401600060405180830381865afa158015610ffd573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261104391908101906148ca565b90505b9093509150505b9250929050565b6040805160808101825260008082526020820181905291810191909152606080820152604080516080810182526000848152600c6020908152838220805463ffffffff8082168652600183015484870152600283015486880152640100000000909104168352600301905291822060608201906110d090613452565b90526000938452600c602052604090932054929364010000000090930463ffffffff1692915050565b611101612a21565b60005b8181101561070b576000838383818110611120576111206145e3565b90506020020135905061113d816003612a0690919063ffffffff16565b611176576040517fe181733f00000000000000000000000000000000000000000000000000000000815260048101829052602401610678565b61118160058261345f565b6111ba576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815260048101829052602401610678565b6000818152600260205260408120906111d38282613a9d565b6111e1600183016000613a9d565b5060020180547fffffffffffffffffffff0000000000000000000000000000000000000000000016905560405181907fdcea1b78b6ddc31592a94607d537543fcaafda6cc52d6d5cc7bbfca1422baf2190600090a25061124081614612565b9050611104565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c9a576000848483818110611281576112816145e3565b90506020028101906112939190614938565b61129c9061496c565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff1682526001810180549596509394919390928401916112f290614667565b80601f016020809104026020016040519081016040528092919081815260200182805461131e90614667565b801561136b5780601f106113405761010080835404028352916020019161136b565b820191906000526020600020905b81548152906001019060200180831161134e57829003601f168201915b50505050508152505090508315801561139b5750805173ffffffffffffffffffffffffffffffffffffffff163314155b156113d4576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610678565b6040808301516000908152600c6020522060018101546114285782604001516040517fd82f6adb00000000000000000000000000000000000000000000000000000000815260040161067891815260200190565b60208301511580611458575082602001518160010154141580156114585750602083015161145890600790612a06565b1561148f576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606083015180516000036114d157806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106789190614a3f565b8154640100000000900463ffffffff168260046114ed836145c0565b82546101009290920a63ffffffff8181021990931691831602179091558354640100000000900416905060005b82518110156115e557611550838281518110611538576115386145e3565b60200260200101516003612a0690919063ffffffff16565b61158857826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106789190614a3f565b6115d483828151811061159d5761159d6145e3565b60200260200101518560030160008563ffffffff1663ffffffff16815260200190815260200160002061345f90919063ffffffff16565b506115de81614612565b905061151a565b50845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff909116178355604085015160028401556001830154602086015181146116575761163c60078261316a565b506020860151600185018190556116559060079061345f565b505b85516040808801516020808a015183519283529082015263ffffffff909216917f4b5b465e22eea0c3d40c30e936643245b80d19b2dcf75788c0699fe8d8db645b910160405180910390a2505050505050806116b290614612565b9050611265565b600e5460609063ffffffff1660006116d260018361464a565b63ffffffff1667ffffffffffffffff8111156116f0576116f0613b0a565b60405190808252806020026020018201604052801561173657816020015b60408051808201909152600081526060602082015281526020019060019003908161170e5790505b509050600060015b8363ffffffff168163ffffffff16101561188e5763ffffffff81166000908152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff161561187e5763ffffffff81166000908152600b60209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff16835260018101805491928401916117d290614667565b80601f01602080910402602001604051908101604052809291908181526020018280546117fe90614667565b801561184b5780601f106118205761010080835404028352916020019161184b565b820191906000526020600020905b81548152906001019060200180831161182e57829003601f168201915b505050505081525050838381518110611866576118666145e3565b60200260200101819052508161187b90614612565b91505b611887816145c0565b905061173e565b50600e5461085e9060019063ffffffff1661464a565b6118ac612a21565b60005b8181101561070b5760008383838181106118cb576118cb6145e3565b90506020028101906118dd9190614a52565b6118e690614a95565b905060006118fc82600001518360200151610449565b905061190960038261345f565b611942576040517febf5255100000000000000000000000000000000000000000000000000000000815260048101829052602401610678565b61194c818361346b565b50508061195890614612565b90506118af565b6000805473ffffffffffffffffffffffffffffffffffffffff163314905b82811015610c9a576000848483818110611999576119996145e3565b90506020028101906119ab9190614938565b6119b49061496c565b805163ffffffff166000908152600b602090815260408083208151808301909252805473ffffffffffffffffffffffffffffffffffffffff168252600181018054959650939491939092840191611a0a90614667565b80601f0160208091040260200160405190810160405280929190818152602001828054611a3690614667565b8015611a835780601f10611a5857610100808354040283529160200191611a83565b820191906000526020600020905b815481529060010190602001808311611a6657829003601f168201915b50505091909252505081519192505073ffffffffffffffffffffffffffffffffffffffff16611ae95781516040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff9091166004820152602401610678565b83158015611b0e5750805173ffffffffffffffffffffffffffffffffffffffff163314155b15611b47576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610678565b6040808301516000908152600c60205220600181015415611b9c5782604001516040517f5461848300000000000000000000000000000000000000000000000000000000815260040161067891815260200190565b6040830151611bdf5782604001516040517f64e2ee9200000000000000000000000000000000000000000000000000000000815260040161067891815260200190565b60208301511580611bfc57506020830151611bfc90600790612a06565b15611c33576040517f8377314600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608301518051600003611c7557806040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106789190614a3f565b81548290600490611c9390640100000000900463ffffffff166145c0565b82546101009290920a63ffffffff818102199093169183160217909155825464010000000090041660005b8251811015611d3a57611cdc838281518110611538576115386145e3565b611d1457826040517f3748d4c60000000000000000000000000000000000000000000000000000000081526004016106789190614a3f565b611d2983828151811061159d5761159d6145e3565b50611d3381614612565b9050611cbe565b50845183547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff91821617845560408601516002850155602086015160018501819055611d90916007919061345f16565b506040850151611da29060099061345f565b50845160408087015160208089015183519283529082015263ffffffff909216917f74becb12a5e8fd0e98077d02dfba8f647c9670c9df177e42c2418cf17a636f05910160405180910390a2505050505080611dfd90614612565b905061197d565b60015473ffffffffffffffffffffffffffffffffffffffff163314611e85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610678565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b828114611f44576040517fab8b67c60000000000000000000000000000000000000000000000000000000081526004810184905260248101829052604401610678565b6000805473ffffffffffffffffffffffffffffffffffffffff16905b8481101561223f576000868683818110611f7c57611f7c6145e3565b9050602002016020810190611f919190614069565b63ffffffff81166000908152600b6020526040902080549192509073ffffffffffffffffffffffffffffffffffffffff16612000576040517fadd9ae1e00000000000000000000000000000000000000000000000000000000815263ffffffff83166004820152602401610678565b6000868685818110612014576120146145e3565b905060200281019061202691906146ba565b61202f906146f8565b805190915073ffffffffffffffffffffffffffffffffffffffff16612080576040517feeacd93900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805173ffffffffffffffffffffffffffffffffffffffff1633148015906120bd57503373ffffffffffffffffffffffffffffffffffffffff861614155b156120f6576040517f9473075d000000000000000000000000000000000000000000000000000000008152336004820152602401610678565b8051825473ffffffffffffffffffffffffffffffffffffffff9081169116141580612172575060208082015160405161212f9201613d5b565b60405160208183030381529060405280519060200120826001016040516020016121599190614b3b565b6040516020818303038152906040528051906020012014155b1561222b57805182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602081015160018301906121cc90826147b0565b50806000015173ffffffffffffffffffffffffffffffffffffffff168363ffffffff167f86f41145bde5dd7f523305452e4aad3685508c181432ec733d5f345009358a2883602001516040516122229190613d5b565b60405180910390a35b5050508061223890614612565b9050611f60565b505050505050565b61224f612a21565b63ffffffff8089166000908152600d60205260408120546401000000009004909116908190036122b3576040517f2b62be9b00000000000000000000000000000000000000000000000000000000815263ffffffff8a166004820152602401610678565b612308888888886040518060a001604052808f63ffffffff168152602001876122db906145c0565b97508763ffffffff1681526020018a1515815260200189151581526020018863ffffffff16815250612aa4565b505050505050505050565b6123436040805160a081018252606080825260208201529081016000815260200160008152600060209091015290565b60008281526002602052604090819020815160a0810190925280548290829061236b90614667565b80601f016020809104026020016040519081016040528092919081815260200182805461239790614667565b80156123e45780601f106123b9576101008083540402835291602001916123e4565b820191906000526020600020905b8154815290600101906020018083116123c757829003601f168201915b505050505081526020016001820180546123fd90614667565b80601f016020809104026020016040519081016040528092919081815260200182805461242990614667565b80156124765780601f1061244b57610100808354040283529160200191612476565b820191906000526020600020905b81548152906001019060200180831161245957829003601f168201915b5050509183525050600282015460209091019060ff16600381111561249d5761249d614334565b60038111156124ae576124ae614334565b81526020016002820160019054906101000a900460ff1660018111156124d6576124d6614334565b60018111156124e7576124e7614334565b81526002919091015462010000900473ffffffffffffffffffffffffffffffffffffffff1660209091015292915050565b60608060006125276003613452565b905060006125356005613154565b82516125419190614be4565b905060008167ffffffffffffffff81111561255e5761255e613b0a565b6040519080825280602002602001820160405280156125bf57816020015b6125ac6040805160a081018252606080825260208201529081016000815260200160008152600060209091015290565b81526020019060019003908161257c5790505b50905060008267ffffffffffffffff8111156125dd576125dd613b0a565b604051908082528060200260200182016040528015612606578160200160208202803683370190505b5090506000805b855181101561287557600086828151811061262a5761262a6145e3565b60200260200101519050612648816005612a0690919063ffffffff16565b6128645760008181526002602052604090819020815160a0810190925280548290829061267490614667565b80601f01602080910402602001604051908101604052809291908181526020018280546126a090614667565b80156126ed5780601f106126c2576101008083540402835291602001916126ed565b820191906000526020600020905b8154815290600101906020018083116126d057829003601f168201915b5050505050815260200160018201805461270690614667565b80601f016020809104026020016040519081016040528092919081815260200182805461273290614667565b801561277f5780601f106127545761010080835404028352916020019161277f565b820191906000526020600020905b81548152906001019060200180831161276257829003601f168201915b5050509183525050600282015460209091019060ff1660038111156127a6576127a6614334565b60038111156127b7576127b7614334565b81526020016002820160019054906101000a900460ff1660018111156127df576127df614334565b60018111156127f0576127f0614334565b81526002919091015462010000900473ffffffffffffffffffffffffffffffffffffffff16602090910152855186908590811061282f5761282f6145e3565b60200260200101819052508084848151811061284d5761284d6145e3565b602090810291909101015261286183614612565b92505b5061286e81614612565b905061260d565b509096919550909350505050565b60608060006128926009613452565b9050805167ffffffffffffffff8111156128ae576128ae613b0a565b60405190808252806020026020018201604052801561291d57816020015b60408051608081018252600080825260208083018290529282015260608082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816128cc5790505b509250805167ffffffffffffffff81111561293a5761293a613b0a565b604051908082528060200260200182016040528015612963578160200160208202803683370190505b50915060005b81518110156129ec57612994828281518110612987576129876145e3565b6020026020010151611054565b8583815181106129a6576129a66145e3565b602002602001018584815181106129bf576129bf6145e3565b602002602001018263ffffffff1663ffffffff168152508290525050806129e590614612565b9050612969565b50509091565b6129fa612a21565b612a03816136ff565b50565b600081815260018301602052604081205415155b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612aa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610678565b565b805163ffffffff9081166000908152600d602090815260408083208286015185168452600101909152902060808301519091161580612af8575060808201518590612af0906001614bf7565b63ffffffff16115b15612b445760808201516040517fd5f5269100000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101869052604401610678565b6001826020015163ffffffff161115612bf057815163ffffffff166000908152600d602090815260408220908401516001918201918391612b85919061464a565b63ffffffff1663ffffffff168152602001908152602001600020905060005b612bad82613154565b811015612bed57612bdc846000015163ffffffff16600c60006105fa858760000161315e90919063ffffffff16565b50612be681614612565b9050612ba4565b50505b60005b85811015612cda57612c20878783818110612c1057612c106145e3565b859260209091020135905061345f565b612c81578251878783818110612c3857612c386145e3565b6040517f636e405700000000000000000000000000000000000000000000000000000000815263ffffffff90941660048501526020029190910135602483015250604401610678565b8251612cc99063ffffffff16600c60008a8a86818110612ca357612ca36145e3565b90506020020135815260200190815260200160002060040161345f90919063ffffffff16565b50612cd381614612565b9050612bf3565b5060005b83811015612fc65736858583818110612cf957612cf96145e3565b9050602002810190612d0b91906146ba565b9050612d1960038235612a06565b612d52576040517fe181733f00000000000000000000000000000000000000000000000000000000815281356004820152602401610678565b612d5e60058235612a06565b15612d98576040517ff7d7a29400000000000000000000000000000000000000000000000000000000815281356004820152602401610678565b8035600090815260038401602052604081208054612db590614667565b90501115612e015783516040517f3927d08000000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015281356024820152604401610678565b60005b87811015612f1357612ea88235600c60008c8c86818110612e2757612e276145e3565b9050602002013581526020019081526020016000206003016000600c60008e8e88818110612e5757612e576145e3565b90506020020135815260200190815260200160002060000160049054906101000a900463ffffffff1663ffffffff1663ffffffff168152602001908152602001600020612a0690919063ffffffff16565b612f0357888882818110612ebe57612ebe6145e3565b6040517fa7e792500000000000000000000000000000000000000000000000000000000081526020909102929092013560048301525082356024820152604401610678565b612f0c81614612565b9050612e04565b5060028301805460018101825560009182526020918290208335910155612f3c90820182614c14565b82356000908152600386016020526040902091612f5a919083614c79565b508351602080860151612fb592918435908c908c90612f7b90880188614c14565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506137f492505050565b50612fbf81614612565b9050612cde565b50604080830151835163ffffffff9081166000908152600d602090815284822080549415156c01000000000000000000000000027fffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff90951694909417909355606086015186518316825284822080549115156d0100000000000000000000000000027fffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffff9092169190911790556080860151865183168252848220805491841668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff909216919091179055918501805186518316845292849020805493909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff9093169290921790558351905191517ff264aae70bf6a9d90e68e0f9b393f4e7fbea67b063b0f336e0b36c158170365192613144929163ffffffff92831681529116602082015260400190565b60405180910390a1505050505050565b6000610477825490565b6000612a1a83836138d5565b6000612a1a83836138ff565b6040805160e0810182526000808252602080830182905282840182905260608084018390526080840183905260a0840181905260c084015263ffffffff8581168352600d825284832080546401000000009004909116808452600190910182528483206002810180548751818602810186019098528088529596929591949390919083018282801561322757602002820191906000526020600020905b815481526020019060010190808311613213575b505050505090506000815167ffffffffffffffff81111561324a5761324a613b0a565b60405190808252806020026020018201604052801561329057816020015b6040805180820190915260008152606060208201528152602001906001900390816132685790505b50905060005b81518110156133b15760405180604001604052808483815181106132bc576132bc6145e3565b602002602001015181526020018560030160008685815181106132e1576132e16145e3565b60200260200101518152602001908152602001600020805461330290614667565b80601f016020809104026020016040519081016040528092919081815260200182805461332e90614667565b801561337b5780601f106133505761010080835404028352916020019161337b565b820191906000526020600020905b81548152906001019060200180831161335e57829003601f168201915b5050505050815250828281518110613395576133956145e3565b6020026020010181905250806133aa90614612565b9050613296565b506040805160e08101825263ffffffff8089166000818152600d60208181528683205480861687528b8616828801526801000000000000000081049095169686019690965260ff6c010000000000000000000000008504811615156060870152929091529093526d010000000000000000000000000090049091161515608082015260a0810161344085613452565b81526020019190915295945050505050565b60606000612a1a836139f2565b6000612a1a8383613a4e565b608081015173ffffffffffffffffffffffffffffffffffffffff16156135b957608081015173ffffffffffffffffffffffffffffffffffffffff163b1580613564575060808101516040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f78bea72100000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff909116906301ffc9a790602401602060405180830381865afa15801561353e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135629190614d94565b155b156135b95760808101516040517fabb5e3fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610678565b6000828152600260205260409020815182919081906135d890826147b0565b50602082015160018201906135ed90826147b0565b5060408201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600183600381111561362f5761362f614334565b021790555060608201516002820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010083600181111561367657613676614334565b0217905550608091909101516002909101805473ffffffffffffffffffffffffffffffffffffffff90921662010000027fffffffffffffffffffff0000000000000000000000000000000000000000ffff90921691909117905560405182907f04f0a9bcf3f3a3b42a4d7ca081119755f82ebe43e0d30c8f7292c4fe0dc4a2ae90600090a25050565b3373ffffffffffffffffffffffffffffffffffffffff82160361377e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610678565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000848152600260208190526040909120015462010000900473ffffffffffffffffffffffffffffffffffffffff161561223f57600084815260026020819052604091829020015490517ffba64a7c0000000000000000000000000000000000000000000000000000000081526201000090910473ffffffffffffffffffffffffffffffffffffffff169063fba64a7c9061389b908690869086908b908d90600401614db1565b600060405180830381600087803b1580156138b557600080fd5b505af11580156138c9573d6000803e3d6000fd5b50505050505050505050565b60008260000182815481106138ec576138ec6145e3565b9060005260206000200154905092915050565b600081815260018301602052604081205480156139e8576000613923600183614be4565b855490915060009061393790600190614be4565b905081811461399c576000866000018281548110613957576139576145e3565b906000526020600020015490508087600001848154811061397a5761397a6145e3565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806139ad576139ad614e33565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610477565b6000915050610477565b606081600001805480602002602001604051908101604052809291908181526020018280548015613a4257602002820191906000526020600020905b815481526020019060010190808311613a2e575b50505050509050919050565b6000818152600183016020526040812054613a9557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610477565b506000610477565b508054613aa990614667565b6000825580601f10613ab9575050565b601f016020900490600052602060002090810190612a039190613af1565b5080546000825590600052602060002090810190612a0391905b5b80821115613b065760008155600101613af2565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613b5c57613b5c613b0a565b60405290565b60405160a0810167ffffffffffffffff81118282101715613b5c57613b5c613b0a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613bcc57613bcc613b0a565b604052919050565b600067ffffffffffffffff821115613bee57613bee613b0a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613c2b57600080fd5b8135613c3e613c3982613bd4565b613b85565b818152846020838601011115613c5357600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215613c8357600080fd5b823567ffffffffffffffff80821115613c9b57600080fd5b613ca786838701613c1a565b93506020850135915080821115613cbd57600080fd5b50613cca85828601613c1a565b9150509250929050565b600060208284031215613ce657600080fd5b5035919050565b60005b83811015613d08578181015183820152602001613cf0565b50506000910152565b60008151808452613d29816020860160208601613ced565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612a1a6020830184613d11565b60008083601f840112613d8057600080fd5b50813567ffffffffffffffff811115613d9857600080fd5b6020830191508360208260051b850101111561104d57600080fd5b8015158114612a0357600080fd5b803563ffffffff81168114613dd557600080fd5b919050565b600080600080600080600060a0888a031215613df557600080fd5b873567ffffffffffffffff80821115613e0d57600080fd5b613e198b838c01613d6e565b909950975060208a0135915080821115613e3257600080fd5b50613e3f8a828b01613d6e565b9096509450506040880135613e5381613db3565b92506060880135613e6381613db3565b9150613e7160808901613dc1565b905092959891949750929550565b60008060208385031215613e9257600080fd5b823567ffffffffffffffff811115613ea957600080fd5b613eb585828601613d6e565b90969095509350505050565b600081518084526020808501945080840160005b83811015613ef157815187529582019590820190600101613ed5565b509495945050505050565b600063ffffffff80835116845260208181850151168186015260408281860151168187015260608501511515606087015260808501511515608087015260a0850151925060e060a0870152613f5460e0870184613ec1565b925060c085015186840360c08801528381518086528486019150848160051b870101858401935060005b82811015613fdb578782037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018452845180518352870151878301879052613fc887840182613d11565b9588019594880194925050600101613f7e565b509998505050505050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561405c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261404a858351613efc565b94509285019290850190600101614010565b5092979650505050505050565b60006020828403121561407b57600080fd5b612a1a82613dc1565b73ffffffffffffffffffffffffffffffffffffffff815116825260006020820151604060208501526140b96040850182613d11565b949350505050565b602081526000612a1a6020830184614084565b602081526000612a1a6020830184613efc565b600080604083850312156140fa57600080fd5b61410383613dc1565b946020939093013593505050565b6040815260006141246040830185613d11565b82810360208401526141368185613d11565b95945050505050565b63ffffffff8151168252602081015160208301526040810151604083015260006060820151608060608501526140b96080850182613ec1565b60408152600061418b604083018561413f565b905063ffffffff831660208301529392505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561405c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452614201858351614084565b945092850192908501906001016141c7565b6000806000806040858703121561422957600080fd5b843567ffffffffffffffff8082111561424157600080fd5b61424d88838901613d6e565b9096509450602087013591508082111561426657600080fd5b5061427387828801613d6e565b95989497509550505050565b60008060008060008060008060c0898b03121561429b57600080fd5b6142a489613dc1565b9750602089013567ffffffffffffffff808211156142c157600080fd5b6142cd8c838d01613d6e565b909950975060408b01359150808211156142e657600080fd5b506142f38b828c01613d6e565b909650945050606089013561430781613db3565b9250608089013561431781613db3565b915061432560a08a01613dc1565b90509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6000815160a0845261437860a0850182613d11565b9050602083015184820360208601526143918282613d11565b9150506040830151600481106143a9576143a9614334565b60408501526060830151600281106143c3576143c3614334565b606085015260809283015173ffffffffffffffffffffffffffffffffffffffff1692909301919091525090565b602081526000612a1a6020830184614363565b6040815260006144166040830185613ec1565b6020838203818501528185518084528284019150828160051b85010183880160005b83811015614484577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0878403018552614472838351614363565b94860194925090850190600101614438565b50909998505050505050505050565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b83811015614508577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08887030185526144f686835161413f565b955093820193908201906001016144bc565b50508584038187015286518085528782019482019350915060005b8281101561454557845163ffffffff1684529381019392810192600101614523565b5091979650505050505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114613dd557600080fd5b60006020828403121561458857600080fd5b612a1a82614552565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff8083168181036145d9576145d9614591565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361464357614643614591565b5060010190565b63ffffffff82811682821603908082111561086e5761086e614591565b600181811c9082168061467b57607f821691505b6020821081036146b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc18336030181126146ee57600080fd5b9190910192915050565b60006040823603121561470a57600080fd5b6040516040810167ffffffffffffffff828210818311171561472e5761472e613b0a565b8160405261473b85614552565b8352602085013591508082111561475157600080fd5b5061475e36828601613c1a565b60208301525092915050565b601f82111561070b57600081815260208120601f850160051c810160208610156147915750805b601f850160051c820191505b8181101561223f5782815560010161479d565b815167ffffffffffffffff8111156147ca576147ca613b0a565b6147de816147d88454614667565b8461476a565b602080601f83116001811461483157600084156147fb5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561223f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561487e5788860151825594840194600190910190840161485f565b50858210156148ba57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156148dc57600080fd5b815167ffffffffffffffff8111156148f357600080fd5b8201601f8101841361490457600080fd5b8051614912613c3982613bd4565b81815285602083850101111561492757600080fd5b614136826020830160208601613ced565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff818336030181126146ee57600080fd5b60006080823603121561497e57600080fd5b614986613b39565b61498f83613dc1565b81526020808401358183015260408401356040830152606084013567ffffffffffffffff808211156149c057600080fd5b9085019036601f8301126149d357600080fd5b8135818111156149e5576149e5613b0a565b8060051b91506149f6848301613b85565b8181529183018401918481019036841115614a1057600080fd5b938501935b83851015614a2e57843582529385019390850190614a15565b606087015250939695505050505050565b602081526000612a1a6020830184613ec1565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618336030181126146ee57600080fd5b803560028110613dd557600080fd5b600060a08236031215614aa757600080fd5b614aaf613b62565b823567ffffffffffffffff80821115614ac757600080fd5b614ad336838701613c1a565b83526020850135915080821115614ae957600080fd5b50614af636828601613c1a565b602083015250604083013560048110614b0e57600080fd5b6040820152614b1f60608401614a86565b6060820152614b3060808401614552565b608082015292915050565b6000602080835260008454614b4f81614667565b80848701526040600180841660008114614b705760018114614ba857614bd6565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838a01528284151560051b8a01019550614bd6565b896000528660002060005b85811015614bce5781548b8201860152908301908801614bb3565b8a0184019650505b509398975050505050505050565b8181038181111561047757610477614591565b63ffffffff81811683821601908082111561086e5761086e614591565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614c4957600080fd5b83018035915067ffffffffffffffff821115614c6457600080fd5b60200191503681900382131561104d57600080fd5b67ffffffffffffffff831115614c9157614c91613b0a565b614ca583614c9f8354614667565b8361476a565b6000601f841160018114614cf75760008515614cc15750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614d8d565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015614d465786850135825560209485019460019092019101614d26565b5086821015614d81577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b600060208284031215614da657600080fd5b8151612a1a81613db3565b6080815284608082015260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff861115614dea57600080fd5b8560051b808860a0850137820182810360a09081016020850152614e1090820187613d11565b91505063ffffffff80851660408401528084166060840152509695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var CapabilityRegistryABI = CapabilityRegistryMetaData.ABI @@ -206,25 +206,26 @@ func (_CapabilityRegistry *CapabilityRegistryTransactorRaw) Transact(opts *bind. return _CapabilityRegistry.Contract.contract.Transact(opts, method, params...) } -func (_CapabilityRegistry *CapabilityRegistryCaller) GetCapabilities(opts *bind.CallOpts) ([]CapabilityRegistryCapability, error) { +func (_CapabilityRegistry *CapabilityRegistryCaller) GetCapabilities(opts *bind.CallOpts) ([][32]byte, []CapabilityRegistryCapability, error) { var out []interface{} err := _CapabilityRegistry.contract.Call(opts, &out, "getCapabilities") if err != nil { - return *new([]CapabilityRegistryCapability), err + return *new([][32]byte), *new([]CapabilityRegistryCapability), err } - out0 := *abi.ConvertType(out[0], new([]CapabilityRegistryCapability)).(*[]CapabilityRegistryCapability) + out0 := *abi.ConvertType(out[0], new([][32]byte)).(*[][32]byte) + out1 := *abi.ConvertType(out[1], new([]CapabilityRegistryCapability)).(*[]CapabilityRegistryCapability) - return out0, err + return out0, out1, err } -func (_CapabilityRegistry *CapabilityRegistrySession) GetCapabilities() ([]CapabilityRegistryCapability, error) { +func (_CapabilityRegistry *CapabilityRegistrySession) GetCapabilities() ([][32]byte, []CapabilityRegistryCapability, error) { return _CapabilityRegistry.Contract.GetCapabilities(&_CapabilityRegistry.CallOpts) } -func (_CapabilityRegistry *CapabilityRegistryCallerSession) GetCapabilities() ([]CapabilityRegistryCapability, error) { +func (_CapabilityRegistry *CapabilityRegistryCallerSession) GetCapabilities() ([][32]byte, []CapabilityRegistryCapability, error) { return _CapabilityRegistry.Contract.GetCapabilities(&_CapabilityRegistry.CallOpts) } @@ -2162,7 +2163,7 @@ func (_CapabilityRegistry *CapabilityRegistry) Address() common.Address { } type CapabilityRegistryInterface interface { - GetCapabilities(opts *bind.CallOpts) ([]CapabilityRegistryCapability, error) + GetCapabilities(opts *bind.CallOpts) ([][32]byte, []CapabilityRegistryCapability, error) GetCapability(opts *bind.CallOpts, hashedId [32]byte) (CapabilityRegistryCapability, error) diff --git a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 1716fed90b6..605607aeb98 100644 --- a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,4 +1,4 @@ GETH_VERSION: 1.13.8 forwarder: ../../../contracts/solc/v0.8.19/KeystoneForwarder/KeystoneForwarder.abi ../../../contracts/solc/v0.8.19/KeystoneForwarder/KeystoneForwarder.bin ec6e94293700d400ca7b22989d54793e905d6febce3b84054727a58c473b9cf3 -keystone_capability_registry: ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.abi ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.bin be7e699bfab89cb95e8d1318dfc74c2af9465d7347478792d6d4afd06ac85402 +keystone_capability_registry: ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.abi ../../../contracts/solc/v0.8.19/CapabilityRegistry/CapabilityRegistry.bin 2913d0d38f6a6edc6d437e16d042c7a6732171213c096259f2113170550e925e ocr3_capability: ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.abi ../../../contracts/solc/v0.8.19/OCR3Capability/OCR3Capability.bin 9dcbdf55bd5729ba266148da3f17733eb592c871c2108ccca546618628fd9ad2