From f18de81201c8217842a6ac333d4779a7e141a4ae Mon Sep 17 00:00:00 2001 From: william Date: Thu, 3 Sep 2026 10:18:38 +0800 Subject: [PATCH] Export 2026-04-01 vm extension image list-version and show --- Commands/vm/extension/image/_list-versions.md | 11 ++ Commands/vm/extension/image/_show.md | 17 ++ .../2026-04-01.json | 1 + .../2026-04-01.xml | 159 ++++++++++++++++++ .../2026-04-01.json | 1 + .../2026-04-01.xml | 138 +++++++++++++++ 6 files changed, 327 insertions(+) create mode 100644 Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnM=/2026-04-01.json create mode 100644 Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnM=/2026-04-01.xml create mode 100644 Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnMve30=/2026-04-01.json create mode 100644 Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnMve30=/2026-04-01.xml diff --git a/Commands/vm/extension/image/_list-versions.md b/Commands/vm/extension/image/_list-versions.md index 26931a284..3c765bc21 100644 --- a/Commands/vm/extension/image/_list-versions.md +++ b/Commands/vm/extension/image/_list-versions.md @@ -25,3 +25,14 @@ List the versions for available extensions. ```bash vm extension image list-versions --publisher Microsoft.Azure.Extensions -l westus -n DockerExtension -o table ``` + +### [2026-04-01](/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnM=/2026-04-01.xml) **Stable** + + + +#### examples + +- Find the available versions for the Docker extension. + ```bash + vm extension image list-versions --publisher Microsoft.Azure.Extensions -l westus -n DockerExtension -o table + ``` diff --git a/Commands/vm/extension/image/_show.md b/Commands/vm/extension/image/_show.md index 694abd484..28b230301 100644 --- a/Commands/vm/extension/image/_show.md +++ b/Commands/vm/extension/image/_show.md @@ -37,3 +37,20 @@ Display information for an extension. vm extension image list-versions --publisher Microsoft.Azure.Extensions -l westus -n DockerExtension --query "[].name" -o tsv | sort | tail -n 1 vm extension image show -l westus --publisher Microsoft.Azure.Extensions -n DockerExtension --version LatestVersion ``` + +### [2026-04-01](/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnMve30=/2026-04-01.xml) **Stable** + + + +#### examples + +- Show the CustomScript extension version 2.0.2. + ```bash + vm extension image show -l westus -n CustomScript --publisher Microsoft.Azure.Extensions --version 2.0.2 + ``` + +- Show the latest version of the Docker extension. + ```bash + vm extension image list-versions --publisher Microsoft.Azure.Extensions -l westus -n DockerExtension --query "[].name" -o tsv | sort | tail -n 1 + vm extension image show -l westus --publisher Microsoft.Azure.Extensions -n DockerExtension --version LatestVersion + ``` diff --git a/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnM=/2026-04-01.json b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnM=/2026-04-01.json new file mode 100644 index 000000000..d6ee456c1 --- /dev/null +++ b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnM=/2026-04-01.json @@ -0,0 +1 @@ +{"plane": "mgmt-plane", "resources": [{"id": "/subscriptions/{}/providers/microsoft.compute/locations/{}/publishers/{}/artifacttypes/vmextension/types/{}/versions", "version": "2026-04-01", "swagger": "mgmt-plane/compute/ResourceProviders/Microsoft.Compute/Paths/L3N1YnNjcmlwdGlvbnMve3N1YnNjcmlwdGlvbklkfS9wcm92aWRlcnMvTWljcm9zb2Z0LkNvbXB1dGUvbG9jYXRpb25zL3tsb2NhdGlvbn0vcHVibGlzaGVycy97cHVibGlzaGVyTmFtZX0vYXJ0aWZhY3R0eXBlcy92bWV4dGVuc2lvbi90eXBlcy97dHlwZX0vdmVyc2lvbnM=/V/MjAyNi0wNC0wMQ=="}], "commandGroups": [{"name": "vm extension image", "commands": [{"name": "list-versions", "version": "2026-04-01", "resources": [{"id": "/subscriptions/{}/providers/microsoft.compute/locations/{}/publishers/{}/artifacttypes/vmextension/types/{}/versions", "version": "2026-04-01", "swagger": "mgmt-plane/compute/ResourceProviders/Microsoft.Compute/Paths/L3N1YnNjcmlwdGlvbnMve3N1YnNjcmlwdGlvbklkfS9wcm92aWRlcnMvTWljcm9zb2Z0LkNvbXB1dGUvbG9jYXRpb25zL3tsb2NhdGlvbn0vcHVibGlzaGVycy97cHVibGlzaGVyTmFtZX0vYXJ0aWZhY3R0eXBlcy92bWV4dGVuc2lvbi90eXBlcy97dHlwZX0vdmVyc2lvbnM=/V/MjAyNi0wNC0wMQ=="}], "argGroups": [{"name": "", "args": [{"type": "ResourceLocation", "var": "$Path.location", "options": ["l", "location"], "required": true, "idPart": "name"}, {"type": "string", "var": "$Path.publisherName", "options": ["p", "publisher", "publisher-name"], "required": true, "group": "", "idPart": "child_name_1", "help": {"short": "Image publisher name."}}, {"type": "SubscriptionId", "var": "$Path.subscriptionId", "options": ["subscription"], "required": true, "idPart": "subscription"}, {"type": "string", "var": "$Path.type", "options": ["n", "name", "type"], "required": true, "group": "", "idPart": "child_name_3", "help": {"short": "Name of the extension."}}, {"type": "string", "var": "$Query.expand", "options": ["expand"], "help": {"short": "Expand the response to include additional read-only metadata. Allowed values: `properties` — returns extended metadata (`releaseCategory`, `urgencyLevel`, `runProfile`)."}, "enum": {"items": [{"name": "properties", "value": "properties"}]}}, {"type": "string", "var": "$Query.filter", "options": ["filter"], "group": "", "help": {"short": "The filter to apply on the operation. Default value is None."}}, {"type": "string", "var": "$Query.orderby", "options": ["orderby"], "group": "", "help": {"short": "The $orderby odata query option."}}, {"type": "integer32", "var": "$Query.top", "options": ["top"], "group": "", "help": {"short": "The $top odata query option."}}]}], "operations": [{"operationId": "VirtualMachineExtensionImages_ListVersions", "http": {"path": "/subscriptions/{subscriptionId}/providers/Microsoft.Compute/locations/{location}/publishers/{publisherName}/artifacttypes/vmextension/types/{type}/versions", "request": {"method": "get", "path": {"params": [{"type": "string", "name": "location", "arg": "$Path.location", "required": true, "format": {"minLength": 1}}, {"type": "string", "name": "publisherName", "arg": "$Path.publisherName", "required": true}, {"type": "string", "name": "subscriptionId", "arg": "$Path.subscriptionId", "required": true, "format": {"minLength": 1}}, {"type": "string", "name": "type", "arg": "$Path.type", "required": true}]}, "query": {"params": [{"type": "string", "name": "$expand", "arg": "$Query.expand", "enum": {"items": [{"value": "properties"}]}}, {"type": "string", "name": "$filter", "arg": "$Query.filter"}, {"type": "string", "name": "$orderby", "arg": "$Query.orderby"}, {"type": "integer32", "name": "$top", "arg": "$Query.top"}], "consts": [{"readOnly": true, "const": true, "default": {"value": "2026-04-01"}, "type": "string", "name": "api-version", "required": true, "format": {"minLength": 1}}]}}, "responses": [{"statusCode": [200], "body": {"json": {"var": "$Instance", "schema": {"type": "array", "item": {"type": "object", "props": [{"readOnly": true, "type": "ResourceId", "name": "id", "format": {"template": "/subscriptions/{}/providers/Microsoft.Compute/locations/{}/publishers/{}/artifacttypes/vmextension/types/{}/versions/{}"}}, {"type": "ResourceLocation", "name": "location", "required": true}, {"readOnly": true, "type": "string", "name": "name"}, {"type": "object", "name": "properties", "props": [{"type": "string", "name": "computeRole", "required": true}, {"readOnly": true, "type": "object", "name": "extensionFeatureMetadata", "props": [{"type": "array", "name": "extensionFeatureTags", "item": {"type": "object", "props": [{"type": "string", "name": "key", "required": true}, {"type": "string", "name": "value"}]}, "identifiers": ["key"]}]}, {"type": "string", "name": "handlerSchema", "required": true}, {"type": "string", "name": "operatingSystem", "required": true}, {"readOnly": true, "type": "string", "name": "releaseCategory", "enum": {"items": [{"value": "BugFix"}, {"value": "CompatibilityUpdate"}, {"value": "NewFeature"}, {"value": "Other"}, {"value": "SecurityFix"}]}}, {"readOnly": true, "type": "string", "name": "releaseNotes"}, {"readOnly": true, "type": "string", "name": "runProfile", "enum": {"items": [{"value": "Hybrid"}, {"value": "LongRunning"}, {"value": "Other"}, {"value": "RunOnce"}]}}, {"type": "boolean", "name": "supportsMultipleExtensions"}, {"readOnly": true, "type": "string", "name": "urgencyLevel", "enum": {"items": [{"value": "Emergency"}, {"value": "Expedited"}, {"value": "Regular"}]}}, {"type": "boolean", "name": "vmScaleSetEnabled"}], "clientFlatten": true}, {"readOnly": true, "type": "object", "name": "systemData", "props": [{"type": "dateTime", "name": "createdAt", "format": {"protocol": "iso"}}, {"type": "string", "name": "createdBy"}, {"type": "string", "name": "createdByType", "enum": {"items": [{"value": "Application"}, {"value": "Key"}, {"value": "ManagedIdentity"}, {"value": "User"}]}}, {"type": "dateTime", "name": "lastModifiedAt", "format": {"protocol": "iso"}}, {"type": "string", "name": "lastModifiedBy"}, {"type": "string", "name": "lastModifiedByType", "enum": {"items": [{"value": "Application"}, {"value": "Key"}, {"value": "ManagedIdentity"}, {"value": "User"}]}}]}, {"type": "object", "name": "tags", "additionalProps": {"item": {"type": "string"}}}, {"readOnly": true, "type": "string", "name": "type"}]}}}}}, {"isError": true, "body": {"json": {"schema": {"type": "@ODataV4Format"}}}}]}}], "outputs": [{"type": "array", "ref": "$Instance", "clientFlatten": true}], "confirmation": ""}]}]} \ No newline at end of file diff --git a/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnM=/2026-04-01.xml b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnM=/2026-04-01.xml new file mode 100644 index 000000000..1bce109e0 --- /dev/null +++ b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnM=/2026-04-01.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnMve30=/2026-04-01.json b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnMve30=/2026-04-01.json new file mode 100644 index 000000000..f9ab9d4fc --- /dev/null +++ b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnMve30=/2026-04-01.json @@ -0,0 +1 @@ +{"plane": "mgmt-plane", "resources": [{"id": "/subscriptions/{}/providers/microsoft.compute/locations/{}/publishers/{}/artifacttypes/vmextension/types/{}/versions/{}", "version": "2026-04-01", "swagger": "mgmt-plane/compute/ResourceProviders/Microsoft.Compute/Paths/L3N1YnNjcmlwdGlvbnMve3N1YnNjcmlwdGlvbklkfS9wcm92aWRlcnMvTWljcm9zb2Z0LkNvbXB1dGUvbG9jYXRpb25zL3tsb2NhdGlvbn0vcHVibGlzaGVycy97cHVibGlzaGVyTmFtZX0vYXJ0aWZhY3R0eXBlcy92bWV4dGVuc2lvbi90eXBlcy97dHlwZX0vdmVyc2lvbnMve3ZlcnNpb259/V/MjAyNi0wNC0wMQ=="}], "commandGroups": [{"name": "vm extension image", "commands": [{"name": "show", "version": "2026-04-01", "resources": [{"id": "/subscriptions/{}/providers/microsoft.compute/locations/{}/publishers/{}/artifacttypes/vmextension/types/{}/versions/{}", "version": "2026-04-01", "swagger": "mgmt-plane/compute/ResourceProviders/Microsoft.Compute/Paths/L3N1YnNjcmlwdGlvbnMve3N1YnNjcmlwdGlvbklkfS9wcm92aWRlcnMvTWljcm9zb2Z0LkNvbXB1dGUvbG9jYXRpb25zL3tsb2NhdGlvbn0vcHVibGlzaGVycy97cHVibGlzaGVyTmFtZX0vYXJ0aWZhY3R0eXBlcy92bWV4dGVuc2lvbi90eXBlcy97dHlwZX0vdmVyc2lvbnMve3ZlcnNpb259/V/MjAyNi0wNC0wMQ=="}], "argGroups": [{"name": "", "args": [{"type": "ResourceLocation", "var": "$Path.location", "options": ["l", "location"], "required": true, "idPart": "name"}, {"type": "string", "var": "$Path.publisherName", "options": ["p", "publisher", "publisher-name"], "required": true, "group": "", "idPart": "child_name_1", "help": {"short": "Image publisher name."}}, {"type": "SubscriptionId", "var": "$Path.subscriptionId", "options": ["subscription"], "required": true, "idPart": "subscription"}, {"type": "string", "var": "$Path.type", "options": ["n", "name", "type"], "required": true, "group": "", "idPart": "child_name_3", "help": {"short": "Name of the extension."}}, {"type": "string", "var": "$Path.version", "options": ["version"], "required": true, "group": "", "idPart": "child_name_4", "help": {"short": "Extension version."}}]}], "operations": [{"operationId": "VirtualMachineExtensionImages_Get", "http": {"path": "/subscriptions/{subscriptionId}/providers/Microsoft.Compute/locations/{location}/publishers/{publisherName}/artifacttypes/vmextension/types/{type}/versions/{version}", "request": {"method": "get", "path": {"params": [{"type": "string", "name": "location", "arg": "$Path.location", "required": true, "format": {"minLength": 1}}, {"type": "string", "name": "publisherName", "arg": "$Path.publisherName", "required": true}, {"type": "string", "name": "subscriptionId", "arg": "$Path.subscriptionId", "required": true, "format": {"minLength": 1}}, {"type": "string", "name": "type", "arg": "$Path.type", "required": true}, {"type": "string", "name": "version", "arg": "$Path.version", "required": true}]}, "query": {"consts": [{"readOnly": true, "const": true, "default": {"value": "2026-04-01"}, "type": "string", "name": "api-version", "required": true, "format": {"minLength": 1}}]}}, "responses": [{"statusCode": [200], "body": {"json": {"var": "$Instance", "schema": {"type": "object", "props": [{"readOnly": true, "type": "ResourceId", "name": "id", "format": {"template": "/subscriptions/{}/providers/Microsoft.Compute/locations/{}/publishers/{}/artifacttypes/vmextension/types/{}/versions/{}"}}, {"type": "ResourceLocation", "name": "location", "required": true}, {"readOnly": true, "type": "string", "name": "name"}, {"type": "object", "name": "properties", "props": [{"type": "string", "name": "computeRole", "required": true}, {"readOnly": true, "type": "object", "name": "extensionFeatureMetadata", "props": [{"type": "array", "name": "extensionFeatureTags", "item": {"type": "object", "props": [{"type": "string", "name": "key", "required": true}, {"type": "string", "name": "value"}]}, "identifiers": ["key"]}]}, {"type": "string", "name": "handlerSchema", "required": true}, {"type": "string", "name": "operatingSystem", "required": true}, {"readOnly": true, "type": "string", "name": "releaseCategory", "enum": {"items": [{"value": "BugFix"}, {"value": "CompatibilityUpdate"}, {"value": "NewFeature"}, {"value": "Other"}, {"value": "SecurityFix"}]}}, {"readOnly": true, "type": "string", "name": "releaseNotes"}, {"readOnly": true, "type": "string", "name": "runProfile", "enum": {"items": [{"value": "Hybrid"}, {"value": "LongRunning"}, {"value": "Other"}, {"value": "RunOnce"}]}}, {"type": "boolean", "name": "supportsMultipleExtensions"}, {"readOnly": true, "type": "string", "name": "urgencyLevel", "enum": {"items": [{"value": "Emergency"}, {"value": "Expedited"}, {"value": "Regular"}]}}, {"type": "boolean", "name": "vmScaleSetEnabled"}], "clientFlatten": true}, {"readOnly": true, "type": "object", "name": "systemData", "props": [{"type": "dateTime", "name": "createdAt", "format": {"protocol": "iso"}}, {"type": "string", "name": "createdBy"}, {"type": "string", "name": "createdByType", "enum": {"items": [{"value": "Application"}, {"value": "Key"}, {"value": "ManagedIdentity"}, {"value": "User"}]}}, {"type": "dateTime", "name": "lastModifiedAt", "format": {"protocol": "iso"}}, {"type": "string", "name": "lastModifiedBy"}, {"type": "string", "name": "lastModifiedByType", "enum": {"items": [{"value": "Application"}, {"value": "Key"}, {"value": "ManagedIdentity"}, {"value": "User"}]}}]}, {"type": "object", "name": "tags", "additionalProps": {"item": {"type": "string"}}}, {"readOnly": true, "type": "string", "name": "type"}]}}}}, {"isError": true, "body": {"json": {"schema": {"type": "@ODataV4Format"}}}}]}}], "outputs": [{"type": "object", "ref": "$Instance", "clientFlatten": true}], "confirmation": ""}]}]} \ No newline at end of file diff --git a/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnMve30=/2026-04-01.xml b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnMve30=/2026-04-01.xml new file mode 100644 index 000000000..2b6edad14 --- /dev/null +++ b/Resources/mgmt-plane/L3N1YnNjcmlwdGlvbnMve30vcHJvdmlkZXJzL21pY3Jvc29mdC5jb21wdXRlL2xvY2F0aW9ucy97fS9wdWJsaXNoZXJzL3t9L2FydGlmYWN0dHlwZXMvdm1leHRlbnNpb24vdHlwZXMve30vdmVyc2lvbnMve30=/2026-04-01.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +